Früher oder später steht jeder Tester, der die Praxis des Selbsttests entwickelt, vor dem Problem der autonomen Durchführung seiner Tests. Wenn der Spezialist erfahren ist, versucht er außerdem, so früh wie möglich damit umzugehen. Nach dem ersten erfolgreichen Autotest vor Ort habe ich mich entschlossen, den Start sofort in TeamCity zu konfigurieren.
Ich stelle fest, dass es in unserem Unternehmen praktisch kein Fachwissen zum Remote-Start von Android-Instrumentaltests gibt, daher musste ich hart googeln, fand dort aber auch keine detaillierten Anleitungen. Deshalb habe ich mich entschlossen, diese Anweisung zu knacken.
Am Eingang haben wir:
- Test (e) werden lokal erfolgreich ausgeführt
- Ausführen des TeamCity-Servers
- Server auf Debian mit KVM und X.
Der Haftungsausschluss sofort über den Server, auf dem der Start durchgeführt werden soll: Das Einrichten des Betriebssystems, der Hardwarevirtualisierung und der grafischen Shell ist nicht Gegenstand dieses Artikels und wird weggelassen.Installieren und konfigurieren Sie den TeamCity-Agenten
Beginnen wir mit Java. Die Hauptsache hier ist, die richtige Version zu wählen. Ich hatte 3 Abhängigkeiten: die Tests selbst, Android Tools und Teamcity Agent. Ich habe bei Version 8 angehalten, um eine JVM für alle zu verwenden. Wenn Sie weniger Glück haben und Konflikte auftreten, müssen Sie die Verwendung mehrerer Java-Versionen auf demselben Computer konfigurieren. Noch ein Hinweis: Wenn Sie Debian haben, müssen Sie zuerst das Webupd8team-Repository hinzufügen (Google ist sehr schnell).
sudo apt-get install oracle-java8-installer sudo apt-get install oracle-java8-set-default
Erstellen Sie als Nächstes einen Benutzer, unter dem der Agent gestartet wird, und entsprechend alles andere. Vergessen Sie nicht, ein Passwort festzulegen.
sudo useradd -d /home/tc_agent -s /bin/bash -m tc_agent sudo passwd tc_agent
Die Agentenverteilung kann über die Weboberfläche Ihrer Teamstadt erfolgen. Gehen Sie dazu zum Abschnitt
Agenten und klicken
Sie oben rechts auf den Link
Build Agents installieren . Laden Sie den gewünschten Ordner auf dem Server herunter und entpacken Sie ihn in den gewünschten Ordner (ich empfehle den Home-Ordner unseres Benutzers -
/home/tc_agent
). Fügen Sie als Nächstes die Rechte zum Ausführen aller Skripts hinzu:
sudo chmod +x /home/tc_agent/BuildAgent/bin/*
Wenn Ihre Version von teamcity Agent Push unterstützt, ist dies immer noch einfacher. Öffnen Sie einfach die entsprechende Registerkarte in der Weboberfläche, klicken Sie auf die Schaltfläche
Install Agent ... und folgen Sie den Anweisungen.
Wir konfigurieren eine Konfiguration. Wenn Sie eine Remote-Installation verwendet haben, wurde diese bereits erstellt und Sie müssen nur den Agentennamen angeben. Wenn nicht, erstellen Sie:
cd /home/tc_agent/BuildAgent/conf cp buildAgent.dist.properties buildAgent.properties nano buildAgent.properties
serverUrl=
Adresse der Webschnittstelle des Servers und
name=
eindeutigen Namen des Agenten. Wenn Sie mehrere Agenten haben oder der Standardport (9090) ausgelastet ist, legen Sie Ihren eigenen mit dem Parameter
ownPort=
.
Wir
/home/tc_agent/BuildAgent/bin/agent.sh start
Befehl
/home/tc_agent/BuildAgent/bin/agent.sh start
. Wenn alles richtig konfiguriert ist, wird unser Agent auf der Registerkarte
Nicht autorisiert angezeigt. Wir autorisieren und Sie können verwenden.
Um den Agenten automatisch zu starten, erstellen Sie das Skript
/etc/init.d/teamcity_agent
mit den folgenden Inhalten:
Fügen Sie die Rechte zum Ausführen von
sudo chmod +x /etc/init.d/teamcity_agent
und fügen
/etc/init.d/teamcity_agent start
der Datei
/etc/rc.local
die Zeile
/etc/init.d/teamcity_agent start
/etc/rc.local
.
Kontrollneustart, der Agent ist gestiegen, wir fahren fort.
Installieren Sie das Android SDK und den Emulator
Laden Sie die
Android SDK-Tools herunter (nur Befehlszeilentools) und entpacken Sie sie in das gewünschte Verzeichnis. Erstellen Sie ein Verzeichnis zum Speichern zukünftiger AVD-Bilder (es sollte genügend Speicherplatz vorhanden sein). Für mich haben Administratoren das Haupt-Repository mit dem Verzeichnis
/var,
und ich werde alles dort ablegen. Als nächstes ändern wir den Eigentümer der Dateien in unseren Benutzer und die nächsten Schritte werden am besten unter ihm ausgeführt.
sudo chown tc_agent -R /var/opt/android-sdk sudo mkdir /var/opt/.android sudo chown tc_agent /var/opt/.android
Umgebungsvariablen hinzufügen. Öffnen Sie die Datei
/home/tc_agent/.bash_profile
zum Bearbeiten und schreiben Sie:
export ANDROID_HOME=/var/opt/android-sdk export ANDROID_AVD_HOME=/var/opt/.android/avd export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/tools:$PATH
Wir starten neu und überprüfen, ob die Variablen in der Teamcity-Weboberfläche auf der Registerkarte
Agentenparameter korrekt angezeigt werden.
Wir versuchen, sdkmanager auszuführen: Der
$ANDROID_HOME/tools/bin/sdkmanager --list
sollte die installierten und verfügbaren Pakete
$ANDROID_HOME/tools/bin/sdkmanager --list
. Wenn Sie
Exception in thread "main" java.lang.NoClassDefFoundError
eine Fehlermeldung wie "
Exception in thread "main" java.lang.NoClassDefFoundError
, versuchen Sie
diese Lösung .
Installieren Sie die erforderlichen Tools und die Images der virtuellen Maschinen.
$ANDROID_HOME/tools/bin/sdkmanager emulator platform-tools tools $ANDROID_HOME/tools/bin/sdkmanager 'system-images;android-25;google_apis;x86'
Erstellen Sie AVD und führen Sie es aus
Also haben wir das Image von
'system-images;android-25;google_apis;x86'
(Android 7.1.1)
'system-images;android-25;google_apis;x86'
und ein darauf basierendes virtuelles Gerät erstellt. Ich werde nicht auf alle möglichen Parameter des Dienstprogramms avdmanager eingehen, sondern es auf die minimal mögliche Menge zeigen:
$ANDROID_HOME/tools/bin/avdmanager create avd -n avd_name -k "system-images;android-25;google_apis;x86"
Wir übertragen den Namen und das Originalbild (es muss vorab über sdkmanager heruntergeladen werden). Wenn der Fehler zurückgegeben wird, fügen Sie das Flag
-v
, um den Text anzuzeigen.
Wir gehen zum Emulator. Überprüfen Sie zunächst den Ordner Emulator, Plattformen, Plattform-Tools und System-Images im SDK-Verzeichnis. Ich habe Plattformen mit meinen Händen erstellt, der Rest wurde bei der Installation von Paketen über sdkmanager erstellt. Überprüfen Sie als Nächstes die Hardwarebeschleunigung. Es sollte eine solche Antwort geben.
$ANDROID_HOME/emulator/emulator -accel-check accel: 0 KVM (version 12) is installed and usable. accel
Wenn beim Zugriff auf
/dev/kvm
ein Fehler
/dev/kvm
, fügen Sie die folgenden Rechte hinzu:
addgroup kvm usermod -a -G kvm tc_agent chown root:kvm /dev/kvm
Außerdem musste ich noch QEMU installieren:
sudo apt-get install qemu-kvm
Machen Sie eine erneute Anmeldung und überprüfen Sie den Emulator erneut.
Wenn alles in Ordnung ist, versuchen Sie zu rennen. Um durch die Augen zu sehen, stellen Sie über vnc eine Verbindung zum Server her. Und führen Sie den Emulator aus:
$ANDROID_HOME/emulator/emulator @avd_name
Das folgende Fenster sollte angezeigt werden:
Während der Testläufe werden wir ohne Grafiken ausgeführt, daher fügen wir den Parameter
-no-window
.
Konfigurieren Sie den Build in TeamCity
Wir gehen zur Endphase über und richten einen autonomen Start unserer Tests ein. Ich habe einen Build von 4 Schritten.
1. Starten Sie den Emulator
nohup /var/opt/android-sdk/emulator/emulator @avd_name -no-snapshot-save -no-boot-anim -no-window -snapshot clean_snap_1 > start_emulator.log 2>&1&
Da der Emulator das Terminal "sperrt", müssen Sie den Prozess mit dem Dienstprogramm nohup lösen (Sie können es auch anders machen - Sie entscheiden). Speichern Sie für alle Fälle das Emulatorprotokoll in der Datei
start_emulator.log
. Um die Tests auszuführen, habe ich einen sauberen Snapshot erstellt (siehe
hier, wie
das geht ) und den Schalter
-no-snapshot-save
hinzugefügt, damit er nicht überschrieben wird.
2. Warten auf den Start des Geräts.
adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'
Zuerst warten wir auf den
sys.boot_completed
wait-for-device
, dann warten wir in der Schleife, wenn die Variable
sys.boot_completed
1 zurückgibt.
3. Ausführen von Tests. Hier ist alles individuell, hier ist mein Beispiel:
./gradlew clean connectedAndroidTest
4. Schließen Sie den Emulator. Hier habe ich bisher eine einfache Beendigung des Prozesses gemacht.
kill -s 2 `pgrep qemu-system`
Es ist jedoch besser, sich beim Erstellen des Emulators die Prozess-ID zu merken. Dies ist erforderlich, wenn wir die Tests in mehreren Threads ausführen, wodurch versehentlich nicht der falsche Prozess "beendet" wird.
Das ist alles, danke fürs Lesen. Wenn es Kommentare von erfahreneren Kollegen gibt, werde ich gerne Änderungen am Handbuch vornehmen.