Jenkins für Android Build mit Docker

Hallo allerseits!

Ich arbeite als Android-Entwickler und vor nicht allzu langer Zeit sind wir auf einige Routineaufgaben in unserem Projekt gestoßen, die wir automatisieren möchten. Zum Beispiel haben wir 5 verschiedene Geschmacksrichtungen, für die wir jeweils unseren Build auf Stoff hochladen müssen, manchmal für verschiedene Wagen mehrmals am Tag. Ja, diese Aufgabe kann auch mit der Gradle-Aufgabe ausgeführt werden, aber ich möchte diesen Prozess nicht auf dem Computer des Entwicklers starten, sondern irgendwie zentral ausführen. Oder laden Sie beispielsweise den Build in Google Play automatisch in die Beta hoch. Nun, ich wollte nur das CI-System auswählen. Was daraus wurde und wie wir es eingerichtet haben, warum gibt es Docker später in diesem Artikel.



Nach meinem Verständnis war die gesamte Aufgabe in ungefähr zwei Phasen unterteilt:

  1. Installieren und konfigurieren Sie Jenkins selbst mit dem Android SDK
  2. Richten Sie Aufgaben bereits in Jenkins ein

In diesem Artikel möchte ich auf den ersten Punkt eingehen. Wenn es für jemanden interessant sein wird, werde ich im nächsten Artikel den Prozess des Einrichtens von Montageaufgaben in Jenkins selbst beschreiben.

Der erste Punkt ist also die Installation und Konfiguration des Jenkins-Systems


Habré hat bereits einen wunderbaren Artikel zu diesem Thema, aber sie ist bereits ein paar Jahre alt, und einige Dinge darin sind etwas veraltet (zum Beispiel sdkmanager), obwohl sie mir sehr geholfen hat, herauszufinden, was ich in der Anfangsphase tun soll.

Wenn Sie sich die offizielle Dokumentation zur Installation von Jenkins ansehen, sehen Sie drei verschiedene Möglichkeiten, um dies zu tun: Starten Sie ein vorgefertigtes Docker-Image, laden Sie eine War-Datei herunter und führen Sie sie aus. Die erste Option ist die richtigste, da sie keine unnötigen Einstellungen und Abhängigkeiten zu unserem Hostsystem enthält. Selbst wenn etwas schief geht, ist es jederzeit einfach, alles zu löschen und erneut zu starten. Das Standard-Docker-Image für Jenkins enthält jedoch einige der Daten, die wir nicht benötigen (z. B. das Blueocean-Plugin), und nicht das, was wir definitiv benötigen (z. B. Android SDK). Es wurde beschlossen, ein eigenes Docker-Image zu erstellen, in dem die War-Datei heruntergeladen und ausgeführt, Android SDK heruntergeladen und installiert sowie alle anderen erforderlichen Einstellungen konfiguriert werden. Um es später zu starten, benötigen wir ein Hostsystem mit installiertem Docker. Ich schlage hier vor, das Rad nicht neu zu erfinden und DigitalOcean zu verwenden.

Erstellen und konfigurieren Sie eine virtuelle Maschine


Wenn jemand anderes dort nicht registriert ist, schlage ich zunächst vor, sich zu registrieren (hier gab es zum Zeitpunkt des Schreibens des Artikels einen Empfehlungslink, aber nachdem ich die Regeln gelesen hatte, habe ich ihn verworfen). Nach der Registrierung können Sie den einen oder anderen Aktionscode im Internet googeln und erhalten ungefähr 10 Dollar für den Start.

Nachdem wir ein neues Tröpfchen bekommen müssen. Wählen Sie den Punkt Droplets und dann Create Droplet .

Bild

Das Hostsystem ist Ubuntu 18.04. Sie können ein Image auswählen, bei dem Docker bereits installiert und konfiguriert ist, aber wir werden alles selbst erledigen. Da die Zusammenstellung von Android-Builds immer noch ressourcenintensiv ist, müssen wir eine Konfiguration für mindestens 20 Dollar auswählen, damit die Builds normal und relativ schnell erfasst werden.

Bild

Wir wählen einen näheren Ort (zum Beispiel in Deutschland). Dann gibt es zwei Möglichkeiten, wie wir uns mit unserem virtuellen Server verbinden. Wir können einen SSH-Schlüssel hinzufügen oder darauf verzichten. Wenn wir an dieser Stelle nicht angeben, welcher Schlüssel verwendet werden soll, wird das Kennwort für den Root-Benutzer an unsere E-Mail gesendet.

Bild

Hier können wir den Servernamen ändern und die Erstellung abschließen, indem wir auf die Schaltfläche Erstellen klicken.

Bild

Jetzt gehen wir in das erstellte Droplet und kopieren die IP-Adresse für uns selbst, um die Verbindung und Konfiguration fortzusetzen.

Bild

Wir brauchen einen SSH-Client. Wenn Sie unter einer Mohnblume arbeiten, können Sie das Standardterminal verwenden. Wenn Sie unter Windows arbeiten, können Sie mit Putty arbeiten oder das Linux-Subsystem verwenden (nur für Windows 10). Ich persönlich benutze die letztere Option und sie passt perfekt zu mir.

Stellen Sie mit dem folgenden Befehl eine Verbindung zu unserem Server her

 ssh root@YOUR_IP_ADDRESS 

Die Konsole bietet Ihnen die Möglichkeit, den Schlüssel zu speichern. Wir sind damit einverstanden. Nach dem Verbinden erstellen wir einen neuen Benutzer für uns selbst, fügen ihn den Superusern hinzu (und geben ihm die Möglichkeit, sudo ohne Passwort zu verwenden), kopieren ihm den Schlüssel für den Zugriff über ssh und sagen, dass er der Eigentümer dieser Dateien ist (andernfalls funktioniert es nicht). Der Benutzername wird in einen für Sie geeigneten Namen geändert.

 useradd -m -s /bin/bash username \ && echo 'username ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \ && mkdir /home/username/.ssh \ && cp /root/.ssh/authorized_keys /home/username/.ssh/authorized_keys \ && chown username:username -R /home/username/.ssh 

Trennen Sie die Verbindung mit dem Befehl von root

 exit 

Und wir werden uns bereits mit Hilfe des neu erstellten Benutzers wieder verbinden

 ssh username@YOUR_IP_ADDRESS 

Nachdem wir das System aktualisiert und unseren Server neu gestartet haben (wenn Sie während des Aktualisierungsvorgangs vom System gefragt werden, reicht es in diesem Fall aus, immer die Standardwerte auszuwählen).

 sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo reboot 

Die Grundeinstellung ist abgeschlossen. Aus Sicht des Kampfsystems ist es nicht sehr sicher, aber im Rahmen dieses Artikels ist es völlig geeignet.

Installieren Sie Docker.


Um Docker in unserem System zu installieren, verwenden wir die offizielle Dokumentation . Da wir ein neu installiertes System haben, überspringen wir diesen Punkt. Wenn Sie ein System haben, auf dem schon lange etwas läuft, löschen Sie auf Empfehlung der Mitarbeiter von Docker mögliche alte Versionen

 sudo apt-get remove docker docker-engine docker.io containerd runc 

Vergessen Sie nicht, zuerst über ssh eine Verbindung zu unserem Server herzustellen. Die Installation von Docker selbst wird in der Dokumentation ausführlich beschrieben. Ich werde allgemeine Befehle geben, um es Ihnen einfacher zu machen. Was sie tun, kann dort gelesen werden. Fügen Sie zuerst das Repository hinzu.

 sudo apt update \ && sudo apt install -y apt-transport-https ca-certificates \ curl gnupg-agent software-properties-common \ && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - \ && sudo apt-key fingerprint 0EBFCD88 \ && sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 

Und dann installieren Sie Docker selbst:

 sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io 

Damit wir in Zukunft Docker-Befehle ohne das Präfix sudo aufrufen können, führen Sie den folgenden Befehl aus (der auch in den Anweisungen sorgfältig beschrieben wird).

 sudo usermod -aG docker username 

Danach müssen Sie sich erneut anmelden (mit dem Befehl exit und erneut eine Verbindung zum Server herstellen), damit dies funktioniert.

Docker selbst ist installiert, was wir mit dem Befehl überprüfen können

 docker run hello-world 

Sie lädt das Testbild herunter und führt es im Container aus. Der Container druckt nach dem Start eine Informationsnachricht und wird beendet.

Herzlichen Glückwunsch, wir haben die Phase der Vorbereitung des Servers für die Arbeit abgeschlossen!

Erstellen Ihres Docker-Images


Wir erstellen das Docker-Image, indem wir unsere eigene Docker-Datei schreiben. Beispiele, wie man dies im Internet richtig macht, ein Wagen und ein kleiner Wagen, ich werde meine fertige Version zeigen und ich werde versuchen, sie so oft wie möglich zu kommentieren. Es gibt auch eine Bedienungsanleitung von Docker selbst mit Beispielen zur korrekten und kanonischen Schreibweise von Docker-Datei.

Erstellen Sie Ihre Docker-Datei und öffnen Sie sie zur Bearbeitung

 touch Dockerfile && nano Dockerfile 

Darin werden wir beispielsweise den Inhalt meiner Docker-Datei ablegen

Meine gesamte Docker-Datei mit Kommentaren
 #    . FROM ubuntu:18.04 #      LABEL author="osipovaleks" LABEL maintainer="osipov.aleks.kr@gmail.com" LABEL version="1.0" LABEL description="Docker image for Jenkins with Android SDK" #  ,  Jenkins    ENV TZ=Europe/Kiev RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # i386    ia32-libs RUN dpkg --add-architecture i386 #      RUN apt-get update && apt-get install -y git \ wget \ unzip \ sudo \ tzdata \ locales\ openjdk-8-jdk \ libncurses5:i386 \ libstdc++6:i386 \ zlib1g:i386 #  ,       RUN apt-get clean && rm -rf /var/lib/apt/lists /var/cache/apt #  RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 #   Android Sdk     ARG android_home_dir=/var/lib/android-sdk/ ARG sdk_tools_zip_file=sdk-tools-linux-4333796.zip RUN mkdir $android_home_dir RUN wget https://dl.google.com/android/repository/$sdk_tools_zip_file -P $android_home_dir -nv RUN unzip $android_home_dir$sdk_tools_zip_file -d $android_home_dir RUN rm $android_home_dir$sdk_tools_zip_file && chmod 777 -R $android_home_dir # environment    ENV ANDROID_HOME=$android_home_dir ENV PATH="${PATH}:$android_home_dir/tools/bin:$android_home_dir/platform-tools" ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ #   Android SDK RUN yes | sdkmanager --licenses #    Jenkins ENV JENKINS_HOME=/var/lib/jenkins RUN mkdir $JENKINS_HOME && chmod 777 $JENKINS_HOME #     jenkins,   ,         RUN useradd -m jenkins && echo 'jenkins ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers USER jenkins WORKDIR /home/jenkins #   war     Jenkins RUN wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war -nv CMD java -jar jenkins.war #      EXPOSE 8080/tcp 


Einige Klarstellungen:

  • Am Anfang bestand der Wunsch, anstelle von Ubuntu ein leichteres Alpin zu verwenden, das jedoch keine Unterstützung für ia32-libs bietet, die für die Erstellung von Projekten mit dem Android SDK erforderlich ist.
  • Wir installieren openjdk-8-jdk, nicht das leichtere openjdk-8-jdk-headless, da einige Jenkins-Funktionen ein komplettes System benötigen (z. B. Anzeigen von Unit-Testergebnissen).
  • Es ist notwendig, Gebietsschemas zu installieren, da bei einigen Projekten ohne diese die Gradle-Assembly ohne eindeutige Fehler und Protokolle abstürzt und ich mehrere Tage damit verbracht habe, diesem Grund auf den Grund zu gehen (auf regulären Ubuntu, die nicht im Docker enthalten sind, sind alle Gebietsschemas standardmäßig gefüllt). .
  • Wir müssen sofort alle Lizenzen für das Android SDK akzeptieren, damit Jenkins während des Erstellungsprozesses die benötigten Komponenten unabhängig installieren kann (z. B. die SDKs, die für verschiedene Versionen der API benötigt werden). Falls erforderlich, können Sie das SDK in Zukunft im Docker-Container mit sdkmanager verwalten. Mit sdkmanager sdkmanager --list können sdkmanager --list beispielsweise alle verfügbaren und alle installierten Komponenten sdkmanager --install "platforms;android-26" , und sdkmanager --install "platforms;android-26" installiert das SDK für Version 26 der API.
  • Im Allgemeinen war es möglich, die Benutzer-Jenkins nicht zu starten und beim Root-Benutzer zu bleiben, aber irgendwie ist es nicht ganz richtig, Sie konnten ihm auch keine Superuser-Rechte geben, aber dies wurde aus praktischen Gründen durchgeführt, wenn etwas installiert werden muss in der Setup- und Debug-Phase.
  • Die Grundgröße des Bildes erwies sich als ziemlich groß (fast 800 MB), aber insgesamt kam ich zu dem Schluss, dass dies für mich nicht sehr kritisch ist und es für mich einfacher ist, es in dieser Form herunterzuladen, als Zeit damit zu verbringen, nicht benötigte Pakete zu suchen und zu entfernen.

Nach dem Schreiben von Dockerfile müssen wir daraus ein fertiges Image für Docker machen, auf dessen Grundlage Container erstellt werden. Dies geschieht einfach durch ein Team

 docker build -t jenkins-image 

Dabei ist der Parameter -t jenkins-image für den Namen Ihres Bildes verantwortlich, und der Punkt am Ende des Befehls gibt an, dass Sie in diesem Verzeichnis nach der Docker-Datei für die Assembly suchen müssen. Der Montageprozess selbst dauert einige Zeit, und nach der Montage sollte sich so etwas in der Konsole befinden.
9fd8f5545c27 erfolgreich gebaut
Erfolgreich getaggt jenkins-image: aktuell
Dies zeigt uns, dass unser Image erfolgreich zusammengestellt wurde und wir mit dem nächsten Schritt fortfahren können, nämlich dem Start unseres Containers

Docker Hub und fertige Bilder


Ja, natürlich können wir unser fertiges Image zum Starten des Containers verwenden. Wenn wir dies jedoch auf mehr als mehreren Geräten tun müssen, ist es nicht sehr praktisch, jedes Mal eine Docker-Datei zu erstellen und daraus ein fertiges Image zu erstellen. Und wenn wir auch den Inhalt unserer Docker-Datei aktualisieren, ist es überhaupt nicht bequem, die Änderungen auf alle Knoten zu übertragen. Zu diesem Zweck gibt es ein öffentliches Repository für Docker Hub- Images. Sie können nicht jedes Mal ein Bild auf jedem Knoten erfassen, sondern es einfach aus dem öffentlichen Repository in sich selbst herunterladen und auf allen Computern gleichermaßen verwenden. Das Bild, das als Beispiel für diesen Artikel diente, ist beispielsweise im Repository mit dem Namen osipovaleks / docker-jenkins-android verfügbar. Später in diesem Artikel werden wir damit arbeiten.

Dieser Artikel impliziert keine detaillierte Untersuchung des Docker Hub. Wir werden nicht verstehen, wie wir unsere Bilder dort hochladen (obwohl dies nicht sehr schwierig ist) und was mit ihnen dort gemacht werden kann. Wir werden nicht verstehen, dass es möglicherweise noch Ihre eigenen öffentlichen oder privaten Repositories gibt. Dabei kann bei Bedarf alles unabhängig aussortiert werden.

Containerstart


Es gibt zwei Möglichkeiten, einen Container zu starten.

  1. Der erste Weg, einfach mit dem docker run , ermöglicht es Ihnen, dies einfach und schnell auf folgende Weise zu tun

     docker run --name jenkins -d -it -v jenkins-data:/var/lib/jenkins -v jenkins-home:/home/jenkins -p 8080:8080 --restart unless-stopped osipovaleks/docker-jenkins-android 

    Dabei hat der Befehl run die folgenden Parameter

    • --name jenkins - Name des zukünftigen Containers
    • -d - Container im Hintergrund starten
    • -it - Flags für die Arbeit mit STDIN und tty
    • -v jenkins-data:/var/lib/jenkins und -v jenkins-home:/home/jenkins - Erstellen (falls nicht erstellt) und Zuordnen spezieller Volumendateien zu den internen Abschnitten des Containers, damit wir unsere konfigurierten Jenkins auch nach der Rekonstruktion speichern können Behälter
    • -p 8080:8080 - Ordnen Sie den Host-Port dem Container-Port zu, damit wir Zugriff auf die Weboberfläche haben (ja, dies ist der Port, den wir in der Docker-Datei angegeben haben).
    • --restart unless-stopped - Die Option bestimmt die Autorun-Richtlinie für Container nach dem Neustart des Hosts (in diesem Fall Autostart, wenn der Container nicht manuell deaktiviert wurde).
    • osipovaleks/docker-jenkins-android - Bild für die Bereitstellung.

    Am Ausgang der Docker-Konsole sollten wir die ID des erstellten Containers abrufen und Informationen darüber anzeigen, wie das Image in das System geladen wird (natürlich, falls es noch nicht geladen ist)
    Bild 'osipovaleks / docker-jenkins-android: aktuell' kann lokal nicht gefunden werden
    spätestens: Ziehen von Osipovaleks / Docker-Jenkins-Android
    6cf436f81810: Fertig ziehen
    987088a85b96: Fertig ziehen
    b4624b3efe06: Fertig ziehen
    d42beb8ded59: Fertig ziehen
    b3896048bb8c: Vollständig ziehen
    8eeace4c3d64: Fertig ziehen
    d9b74624442c: Vollständig ziehen
    36bb3b7da419: Vollständig ziehen
    31361bd508cb: Fertig ziehen
    cee49ae4c825: komplett ziehen
    868ddf54d4c1: Fertig ziehen
    361bd7573dd0: Vollständig ziehen
    bb7b15e36ae8: Vollständig ziehen
    97f19daace79: Vollständig ziehen
    1f5eb3850f3e: Fertig ziehen
    651e7bbedad2: Fertig ziehen
    a52705a2ded7: Fertig ziehen
    Digest: sha256: 321453e2f2142e433817cc9559443387e9f680bb091d6369bbcbc1e0201be1c5
    Status: Neuere Bilder für osipovaleks / docker-jenkins-android heruntergeladen: neueste
    ef9e5512581da66d66103d9f6ea6ccd74e5bdb3776747441ce6a88a98a12b5a4
  2. Der zweite Weg besteht darin, eine spezielle Compose-Datei zu schreiben, in der der Befehl run einfach mit der YAML- Sprache beschrieben und mit Docker Compose gestartet wird.

    Dazu müssen wir es installieren:

     sudo apt update && sudo apt install -y docker-compose 

    Erstellen Sie als Nächstes ein Verzeichnis für das Projekt (dies ist wichtig, wenn Sie sich darum kümmern, wie die automatisch erstellten Volumes für den Container aufgerufen werden) und wechseln Sie zu diesem Verzeichnis

     mkdir jenkinsProject && cd jenkinsProject 

    und im Inneren erstellen wir die Erstellungsdatei selbst und gehen in den Bearbeitungsmodus

     touch docker-compose.yml && nano docker-compose.yml 

    und fügen Sie den folgenden Inhalt ein

     version: '3' services: jenkins: container_name: jenkins image: osipovaleks/docker-jenkins-android ports: - "8080:8080" restart: unless-stopped volumes: - "jenkins-data:/var/lib/jenkins" - "jenkins-home:/home/jenkins" volumes: jenkins-data: jenkins-home: 

    Darin wirft möglicherweise nur die erste Zeile Fragen auf ( version: '3' ), die die Version der Funktionen der Erstellungsdatei angeben, sowie einen Abschnitt mit dem volumes Block, in dem die in diesem Container verwendeten aufgeführt sind

    Führen Sie Ihren Container mit dem folgenden Befehl aus:

     docker-compose up -d 

    Dabei zeigt das Flag -d auch an, dass der Container im Hintergrund erstellt und gestartet wird. Infolgedessen sollte Docker Folgendes anzeigen:
    Erstellen des Volumes "jenkinsproject_jenkins-data" mit dem Standardtreiber
    Erstellen des Volumes "jenkinsproject_jenkins-home" mit dem Standardtreiber
    Jenkins ziehen (osipovaleks / docker-jenkins-android: aktuell) ...
    spätestens: Ziehen von Osipovaleks / Docker-Jenkins-Android
    6cf436f81810: Fertig ziehen
    987088a85b96: Fertig ziehen
    b4624b3efe06: Fertig ziehen
    d42beb8ded59: Fertig ziehen
    b3896048bb8c: Vollständig ziehen
    8eeace4c3d64: Fertig ziehen
    d9b74624442c: Vollständig ziehen
    36bb3b7da419: Vollständig ziehen
    31361bd508cb: Fertig ziehen
    cee49ae4c825: komplett ziehen
    868ddf54d4c1: Fertig ziehen
    361bd7573dd0: Vollständig ziehen
    bb7b15e36ae8: Vollständig ziehen
    97f19daace79: Vollständig ziehen
    1f5eb3850f3e: Fertig ziehen
    651e7bbedad2: Fertig ziehen
    a52705a2ded7: Fertig ziehen
    Digest: sha256: 321453e2f2142e433817cc9559443387e9f680bb091d6369bbcbc1e0201be1c5
    Status: Neuere Bilder für osipovaleks / docker-jenkins-android heruntergeladen: neueste
    Jenkins erstellen ...
    Jenkins erstellen ... fertig
    Denken Sie daran, ich sagte, dass der Name der erstellten Volumes vom Namen des Projekts abhängt. Führen Sie den folgenden Befehl aus:

     docker volume ls 

    und wir bekommen eine solche Ausgabe
    DRIVER VOLUME NAME
    lokale jenkinsproject_jenkins-Daten
    lokales jenkinsproject_jenkins-home
    wo wir sehen werden, dass trotz der Tatsache, dass der Name für Volume von jenkins-home , in Wirklichkeit ein Präfix aus dem Projektnamen daran jenkinsproject _jenkins-home und sich herausstellte, dass der Name volume jenkinsproject _jenkins-home


Welche Startoption soll verwendet werden? Hier können Sie selbst auswählen, dass Docker Compose eher ein Tool zum gleichzeitigen Starten mehrerer miteinander verbundener Container ist. Wenn Sie nur einen Container starten müssen, können Sie den docker run .

Nach diesen Unterschritten zum Starten und Konfigurieren des Servers sowie zum Starten des Containers mit Jenkins können wir nun mit der Erstkonfiguration fortfahren

Erstes Jenkins-Setup


Nehmen Sie die IP-Adresse unseres Servers, fügen Sie den von uns angegebenen Port 8080 hinzu und folgen Sie diesem Link im Browser.

http://YOUR_IP_ADDRESS:8080/

Wenn vorher alles richtig konfiguriert und gestartet wurde, sehen wir hier das folgende Bild



Für das erste Setup müssen wir das Kennwort eingeben, das das System während der Installation generiert hat. Dazu müssen wir uns nur den Inhalt der Datei /var/lib/jenkins/secrets/initialAdminPassword . Diese Datei befindet sich jedoch in unserem laufenden Container. Um sie lesen zu können, müssen wir mit dem folgenden Befehl eine Verbindung zum Container herstellen:

 docker exec -it jenkins /bin/bash 

-it Option -it der Ausführung von docker run ähnelt, ist jenkins der Name unseres Containers, und /bin/bash führt /bin/bash für uns im Container aus und gewährt ihm Zugriff. Danach sehen wir das ursprüngliche Passwort für Jenkins:

 cat /var/lib/jenkins/secrets/initialAdminPassword 

Folgendes wird in der Konsole angezeigt
91092b18d6ca4492a2759b1903241d2a
Dies ist das Passwort.

Benutzer ALexhha schlug eine einfachere Option zum Lesen dieses Kennworts vor, ohne eine Verbindung zum Container selbst herzustellen. Tatsache ist, dass zum Zeitpunkt des Starts von Jenkins selbst dieses Kennwort in den Protokollen angezeigt wird. Es stellt sich heraus, dass wir nur die Containerprotokolle lesen müssen. In unserem Fall erfolgt dies mit dem folgenden Befehl:

 docker logs jenkins 


Dabei ist jenkins Name unseres Containers. In den Protokollen sehen Sie Folgendes:

***************************************************** ** ***********
******************************************************** ***********
******************************************************** ***********

Jenkins Ersteinrichtung ist erforderlich. Ein Administrator wurde erstellt und ein Kennwort generiert.
Bitte verwenden Sie das folgende Passwort, um mit der Installation fortzufahren:

91092b18d6ca4492a2759b1903241d2a

Dies kann auch gefunden werden unter: / var / lib / jenkins / Secrets / initialAdminPassword

***************************************************** ** ***********
******************************************************** ***********

***************************************************** ** ***********

Diese Option ist etwas einfacher und schneller.

Kopieren Sie es, fügen Sie es in das Feld Administratorkennwort in der Weboberfläche ein und klicken Sie auf Weiter . Wählen Sie im nächsten Bildschirm Ausgewählte Plugins installieren und installieren Sie eine Reihe von Standard-Plugins.





Erstellen Sie nach der Installation der Plugins einen Benutzer für uns und klicken Sie auf Speichern und beenden



Wir stimmen dem Abschnitt Instanzkonfiguration zu, in dem wir aufgefordert werden, die URL auszufüllen, unter der Jenkins arbeiten wird (in unserem Fall lassen Sie alles so wie es ist).



Und klicken Sie im nächsten Bildschirm auf den geschätzten Start mit Jenkins



Also haben wir Jenkins installiert und gestartet!



Es ist bereits durchaus möglich, damit zu arbeiten, aber um unsere Android-Builds zu sammeln, müssen Sie einige weitere Punkte konfigurieren. Die Lokalisierung von Jenkins hängt mit der ausgewählten Sprache Ihres Browsers zusammen, und natürlich ist die Übersetzung ins Russische noch nicht vollständig abgeschlossen, und wir erhalten eine höllische Mischung aus Russisch und Englisch. Wenn Sie genau so erfolgreich waren und es Sie wütend macht, können Sie das spezielle Plug-In verwenden und die Standardsprache für die Benutzeroberfläche festlegen. Oder schalten Sie Ihren Browser auf die englische Oberfläche um.

Gehen Sie zu Jenkins Einstellungen und wählen Sie Systemkonfiguration.



Wir kreuzen die Umgebungsumgebung an , geben den Namen ANDROID_HOME in das Feld ein und geben im Feld / var / lib / android-sdk / an (wir haben diese Daten in der Docker-Datei als Ausgangsverzeichnis für das Android SDK angegeben).



Klicken Sie auf die Schaltfläche Speichern , verlassen Sie diesen Einstellungsabschnitt und wechseln Sie zum Abschnitt Globale Tools-Konfiguration .



Richten Sie die JDK- Partition ein (wobei die Variable JAVA_HOME auch von uns in der Docker-Datei ausgefüllt wurde und wir ihren Wert / usr / lib / jvm / java-8-openjdk-amd64 / hier verwenden können ).



Auch hier müssen wir noch den Abschnitt Gradle ausfüllen. Wir wählen und installieren die Version von Gradle, die in den Projekten verwendet wird, die Sie mit diesem CI-System erstellen.Sie können mehrere Versionen haben. Sie können die Gradle-Variable auch überhaupt nicht starten, wenn Sie beispielsweise gradlew im Repository haben und es damit erstellen können.



Damit können wir unsere erste Etappe beenden. Das Jenkins-System ist voll funktionsfähig und wir können die Build-Aufgaben selbst anpassen. Bitte beachten Sie, dass das System an unsere Bedürfnisse angepasst wurde und möglicherweise nicht das bietet, was Sie benötigen. Beispielsweise gibt es keine Android-Emulatoren zum Testen und NDK.

Wenn dieser Artikel jemanden interessiert, werde ich im zweiten Teil mit einem Beispiel für ein oder zwei Probleme fortfahren und die Integration von Jenkins und Bitbucket beschreiben (er ist es, nicht Github, weil es mit kostenlosen privaten Repositories und Artikeln im Internet einfacher ist Es ist kleiner, macht aber vielleicht mehr Spaß. Ich werde Ihnen sagen, wie Sie sich mit dem SSH-Schlüssel unseres Containers mit dem Repository anfreunden können, über E-Mail-Benachrichtigungen und verschiedene andere Chips. Im Allgemeinen über alles, was wir konfiguriert haben.

Ich bitte Sie, nicht viel zu treten, dies ist mein erster Artikel über Habr. Gut zu allen!

Source: https://habr.com/ru/post/de443606/


All Articles