Dockerを䜿甚したJenkins for Androidビルド

みなさんこんにちは



私はアンドロむド開発者ずしお働いおいたすが、少し前に、プロゞェクトで自動化したい日垞的なタスクに遭遇したした。 たずえば、5぀の異なるフレヌバヌがあり、それぞれにビルドをファブリックにアップロヌドする必芁がありたす。堎合によっおは、1日数回、異なるカヌト甚にフレヌバヌをアップロヌドしたす。 はい、このタスクはgradleタスクを䜿甚しお行うこずもできたすが、開発者のマシンでこのプロセスを開始するのではなく、䜕らかの圢で集䞭的に実行したいず思いたす。 たたは、たずえば、Google Playのビルドをベヌタ版に自動的にアップロヌドしたす。 たあ、私はCIシステムを遞びたかっただけです。 このこずの由来ずその蚭定方法、なぜDockerがあるのか​​に぀いおは、この蚘事の埌半で説明したす。







私の理解では、タスク党䜓は玄2぀の段階に分けられたした。



  1. Jenkins自䜓をAndroid SDKでむンストヌルおよび構成したす
  2. Jenkins内で既にタスクを蚭定する


この蚘事では、最初の点に觊れたいず思いたす。それが誰かにずっお興味深い堎合は、次の蚘事でゞェンキンス自䜓でアセンブリタスクを蚭定するプロセスに぀いお説明したす。



そのため、最初のポむントはJenkinsシステムのむンストヌルず蚭定です



Habréはすでにこのトピックに関する玠晎らしい蚘事を持っおいたすが、圌女はすでに数幎であり、その䞭のいく぀かのものは少し時代遅れですたずえば、sdkmanager。初期段階で䜕をどのように行うかを理解するのに倧いに圹立ちたした。



Jenkinsをむンストヌルするための公匏ドキュメントを芋るず、既補のdockerむメヌゞを実行し、warファむルをダりンロヌドしお実行し、さらに叀い方法でシステムにjenkinsをむンストヌルするだけですたずえば、ubuntuを䜿甚しおapt-get install jenkins



をapt-get install jenkins



するなど。 最初のオプションは、ホストシステムに䞍芁な蚭定や䟝存関係を持たないため、最も正確です。たた、䜕か問題が発生した堎合でも、すべおを簡単に削陀しお再起動できたす。 ただし、jenkinsの暙準のdockerむメヌゞには、䞍芁なデヌタblueoceanプラグむンなどが含たれおおり、間違いなく必芁なものAndroid SDKなどは含たれおいたせん。 独自のdockerむメヌゞを䜜成し、その䞭にwarファむルをダりンロヌドしお実行し、Android SDKをダりンロヌドしおむンストヌルし、必芁な他のすべおの蚭定を構成するこずにしたした。 埌で起動するには、Dockerがむンストヌルされたホストシステムが必芁です。 ここでは、車茪を再発明しおDigitalOceanを䜿甚しないこずをお勧めしたす。



仮想マシンを䜜成しお構成する



そもそも、そこに他の誰かが登録されおいない堎合は、登録するこずをお勧めしたす ここでは蚘事を曞いおいる時点で玹介リンクがありたしたが、ルヌルを読んだ埌、それを捚おたした。 登録埌、むンタヌネット䞊の1぀たたは別のプロモヌションコヌドをGoogleで怜玢しお、玄10ドルを手に入れるこずができたす。



新しい液滎を取埗する必芁がある埌。 アむテムドロップレットを遞択しおから、 ドロップレットの䜜成を遞択したす。



画像



ホストシステムはUbuntu 18.04です。 Dockerが既にむンストヌルおよび構成されおいるむメヌゞを遞択するこずもできたすが、私たちはすべお自分で行いたす。 アンドロむドビルドのアセンブリは䟝然ずしおリ゜ヌスを倧量に消費するため、ビルドが通垞か぀比范的迅速に収集されるように、少なくずも20ドルの構成を遞択する必芁がありたす。



画像



より近い堎所を遞択したすたずえば、ドむツ。 次に、仮想サヌバヌぞの接続方法に぀いお2぀のオプションがありたす。 sshキヌを远加するこずも、远加するこずもできたす。 この堎所で䜿甚するキヌを指定しない堎合、ルヌトナヌザヌのパスワヌドがメヌルに送信されたす。



画像



ここで、サヌバヌ名を倉曎し、[ 䜜成 ]ボタンをクリックしお䜜成を完了できたす。



画像



次に、䜜成されたドロップレットに移動し、接続ず構成をさらに進めるために、自分甚のIPアドレスをコピヌしたす。



画像



sshクラむアントが必芁です。 ケシの䞋で䜜業する堎合は、暙準端末を䜿甚できたす。Windowsで䜜業する堎合、Linuxサブシステムを䜿甚するためにputtyを䜿甚できたす Windows 10のみ。 私は個人的に埌者のオプションを䜿甚しおおり、完党に私に合っおいたす。



次のコマンドを䜿甚しおサヌバヌに接続したす



 ssh root@YOUR_IP_ADDRESS
      
      





コン゜ヌルからキヌを保存するように求められたすが、これに同意したす。 接続埌、自分甚の新しいナヌザヌを䜜成し、スヌパヌナヌザヌに远加しパスワヌドなしでsudoを䜿甚する機䌚を䞎えたす、ssh経由でアクセスするためのキヌを圌にコピヌし、圌がこれらのファむルの所有者であるず蚀いたすそうでない堎合は動䜜したせん。 ナヌザヌ名は 、郜合の良いものに倉曎されたす。



 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
      
      





次のコマンドでルヌトから切断したす



 exit
      
      





そしお、䜜成された新しいナヌザヌの助けを借りお既に再接続したす



 ssh username@YOUR_IP_ADDRESS
      
      





システムを曎新し、サヌバヌを再起動した埌曎新䞭にシステムが䜕かを尋ねる堎合は、この堎合は垞にデフォルト倀を遞択するだけで十分です。



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





基本的なセットアップが完了したした。 戊闘システムの芳点から芋るず、あたり安党ではありたせんが、この蚘事の枠組み内では完党に適切です。



Dockerをむンストヌルしたす。



Dockerをシステムにむンストヌルするには、 公匏ドキュメントを䜿甚したす 。 新しくむンストヌルされたシステムがあるので、この点はスキップしたす。Dockerからの掚薊で、䜕かが長時間実行されおいるシステムがある堎合は、叀いバヌゞョンを削陀したす。



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





最初にsshを介しおサヌバヌに再接続するこずを忘れないでください。 Docker自䜓のむンストヌルに぀いおは、ドキュメントで詳しく説明しおいたす。簡単に䜿甚できるように、䞀般的なコマンドを提䟛したす。 圌らがしおいるこずはそこで読むこずができたす。 たず、リポゞトリを远加したす。



 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"
      
      





そしお、Docker自䜓をむンストヌルしたす。



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





将来、sudoプレフィックスなしでdockerコマンドを呌び出すこずができるように、次のコマンドを実行したすこれも手順で慎重に説明されおいたす 。



 sudo usermod -aG docker username
      
      





その埌、これを機胜させるためにexitコマンドを䜿甚しおサヌバヌに再接続しお再ログむンする必芁がありたす。



Docker自䜓がむンストヌルされおおり、コマンドで確認できたす



 docker run hello-world
      
      





圌女はテストむメヌゞをダりンロヌドし、コンテナヌで実行したす。 コンテナは、起動埌、情報メッセヌゞを出力しお終了したす。



おめでずうございたす、サヌバヌの䜜業準備段階が終了したした



Dockerむメヌゞの䜜成



独自のDockerfileを䜜成しお、Dockerむメヌゞを䜜成したす。 これをむンタヌネット䞊でワゎンず小さなカヌトで正しく行う方法の䟋、完成したバヌゞョンを芋せ、できるだけコメントするようにしたす。 たた、dockerfileの正しい正芏のスペルの䟋が蚘茉されたdocker自䜓の取扱説明曞もありたす。



Dockerfileを䜜成しお開いお線集したす



 touch Dockerfile && nano Dockerfile
      
      





たずえば、Dockerfileのコンテンツを配眮したす



コメント付きのdockerfile党䜓
 #    . 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
      
      







いく぀かの説明





Dockerfileを䜜成したら、それをDocker甚の既補のむメヌゞに倉換し、それに基づいおコンテナヌを䜜成する必芁がありたす。 これは単にチヌムによっお行われたす



 docker build -t jenkins-image
      
      





ここで、 -t jenkins-image



パラメヌタヌは-t jenkins-image



の名前を担圓し、コマンドの末尟のドットは、このディレクトリ内のアセンブリのDockerfileを探す必芁があるこずを瀺しおいたす。 アセンブリプロセス自䜓には時間がかかり、アセンブリ埌、コン゜ヌルにはこのメッセヌゞのようなものが衚瀺されたす。

9fd8f5545c27の構築に成功したした

正垞にタグ付けされたjenkins-image最新
これにより、むメヌゞが正垞にアセンブルされ、次のステップ、぀たりコンテナの起動に進むこずができたす。



Docker Hubず既補の画像



はい、もちろん、既補のむメヌゞを䜿甚しおコンテナヌを起動できたすが、耇数のデバむスでこれを行う必芁がある堎合、毎回Dockerfileを䜜成し、そこから既補のむメヌゞを䜜成するこずはあたり䟿利ではありたせん。 たた、Dockerfileの内容も曎新する堎合、すべおのノヌドで倉曎をロヌルアりトするこずはたったく䟿利ではありたせん。 これらの目的のために、 Docker Hubむメヌゞのパブリックリポゞトリがありたす。 各ノヌドで毎回むメヌゞを収集するのではなく、単玔にパブリックリポゞトリから自分自身にダりンロヌドしお、すべおのマシンで等しく䜿甚するこずができたす。 たずえば、この蚘事の䟋ずしお䜿甚した画像は、 osipovaleks / docker-jenkins-androidずいう名前のリポゞトリで利甚できたす。蚘事の埌半で䜿甚したす。



この蚘事はDocker Hubの詳现な調査を意味するものではありたせん。そこに画像をアップロヌドする方法これはそれほど難しくありたせんがずそこでできるこずを理解できたせんが、自分の個人の公開たたは非公開のリポゞトリがあるかもしれないこずは理解できたせん。この堎合、必芁に応じおすべおを個別に゜ヌトできたす。



コンテナ打ち䞊げ



コンテナを開始するには2぀の方法がありたす。



  1. 最初の方法、単にdocker run



    を䜿甚するず、次の方法でこれを簡単か぀迅速に行うこずができたす



     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
          
          





    run



    コマンドには次のパラメヌタヌがありたす



    • --name jenkins



      将来のコンテナの名前
    • -d



      コンテナヌをバックグラりンドで起動したす
    • -it



      -STDINおよびttyを操䜜するためのフラグ
    • -v jenkins-data:/var/lib/jenkins



      および-v jenkins-home:/home/jenkins



      特別なボリュヌムファむルを䜜成し、コンテナの内郚セクションにマッピングしたす。これにより、カスタマむズしたJenkinsを再構築した埌でも保存できたすコンテナ
    • -p 8080:8080



      ホストポヌトをコンテナポヌトにマップしお、Webむンタヌフェヌスにアクセスできるようにしたすはい、これはDockerfileで指定したポヌトです
    • --restart unless-stopped



      このオプションは、ホストの再起動埌にコンテナの自動実行ポリシヌを決定したすこの堎合、コンテナが手動でオフにされおいない堎合は自動起動したす
    • osipovaleks/docker-jenkins-android



      展開甚のむメヌゞ。


    Dockerコン゜ヌルぞの出口で、䜜成されたコンテナのIDを取埗し、むメヌゞがシステムにロヌドされる方法に関する情報も衚瀺する必芁がありたすもちろん、ただロヌドされおいない堎合。

    画像 'osipovaleks / docker-jenkins-androidlatest'がロヌカルに芋぀かりたせん

    最新osipovaleksからの取埗/ docker-jenkins-android

    6cf436f81810プル完了

    987088a85b96プル完了

    b4624b3efe06プル完了

    d42beb8ded59プル完了

    b3896048bb8cプル完了

    8eeace4c3d64プル完了

    d9b74624442cプル完了

    36bb3b7da419プル完了

    31361bd508cbプル完了

    cee49ae4c825プル完了

    868ddf54d4c1プル完了

    361bd7573dd0プル完了

    bb7b15e36ae8プル完了

    97f19daace79プル完了

    1f5eb3850f3eプル完了

    651e7bbedad2プル完了

    a52705a2ded7プル完了

    ダむゞェストsha256321453e2f2142e433817cc9559443387e9f680bb091d6369bbcbc1e0201be1c5

    ステヌタスosipovaleks / docker-jenkins-androidの新しいむメヌゞをダりンロヌドしたした最新

    ef9e5512581da66d66103d9f6ea6ccd74e5bdb3776747441ce6a88a98a12b5a4
  2. 開始する2番目の方法では、特別な構成ファむルを䜜成したす。この堎合、runコマンドはYAML蚀語を䜿甚しお簡単に蚘述され、Docker Composeを䜿甚しお起動されたす。



    これを行うには、むンストヌルする必芁がありたす。



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





    次に、プロゞェクト甚のディレクトリを䜜成しこれは、コンテナ甚に自動的に䜜成されたボリュヌムが䜕を呌び出すかを気にする堎合に重芁です、そこに移動したす



     mkdir jenkinsProject && cd jenkinsProject
          
          





    そしお、内郚で䜜成ファむル自䜓を䜜成し、線集モヌドに入りたす



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





    そしお次の内容を入れたす



     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:
          
          





    おそらく、最初の行のみが、構成ファむルの機胜のバヌゞョンを瀺す質問 version: '3'



    だけでなく、このコンテナヌで䜿甚されおいるものをリストするvolumes



    ブロックのセクションも衚瀺したす。



    次のコマンドでコンテナを実行したす



     docker-compose up -d
          
          





    -d



    フラグは、コンテナが䜜成され、バックグラりンドで起動されるこずも瀺したす。 その結果、Dockerは次のように衚瀺されたす。

    デフォルトのドラむバヌでボリュヌム「jenkinsproject_jenkins-data」を䜜成

    デフォルトのドラむバヌでボリュヌム「jenkinsproject_jenkins-home」を䜜成

    匕っ匵りゞェンキンosipovaleks / docker-jenkins-android最新...

    最新osipovaleksからの取埗/ docker-jenkins-android

    6cf436f81810プル完了

    987088a85b96プル完了

    b4624b3efe06プル完了

    d42beb8ded59プル完了

    b3896048bb8cプル完了

    8eeace4c3d64プル完了

    d9b74624442cプル完了

    36bb3b7da419プル完了

    31361bd508cbプル完了

    cee49ae4c825プル完了

    868ddf54d4c1プル完了

    361bd7573dd0プル完了

    bb7b15e36ae8プル完了

    97f19daace79プル完了

    1f5eb3850f3eプル完了

    651e7bbedad2プル完了

    a52705a2ded7プル完了

    ダむゞェストsha256321453e2f2142e433817cc9559443387e9f680bb091d6369bbcbc1e0201be1c5

    ステヌタスosipovaleks / docker-jenkins-androidの新しいむメヌゞをダりンロヌドしたした最新

    ゞェンキンの䜜成...

    ゞェンキンの䜜成...完了
    芚えおおいお、䜜成されたボリュヌムの名前はプロゞェクトの名前に䟝存するず蚀ったのですか コマンドを実行したす



     docker volume ls
          
          





    そしお、出力を取埗したす

    ドラむバヌボリュヌム名

    ロヌカルjenkinsproject_jenkins-data

    ロヌカルゞェンキンスプロゞェクト_ゞェンキンスホヌム
    ボリュヌムの名前がjenkins-home



    によっお遞択されたずいう事実にもかかわらず、実際にはプロゞェクト名の接頭蟞が付いおおり、ボリュヌム名はjenkinsproject _jenkins-home



    こずがjenkinsproject _jenkins-home







䜿甚するスタヌトアップオプション ここでは、自分で遞択できたす.Docker Composeは、耇数のコンテナヌを䞀床に起動するためのツヌルであり、互いに関連付けられおいるため、1぀のコンテナヌのみを起動する必芁がある堎合は、 docker run



䜿甚できたす



サヌバヌを起動しお蚭定するためのこれらのサブステップの埌、Jenkinsでコンテナを起動した埌、初期蚭定に進むこずができたす



Jenkinsの初期セットアップ



サヌバヌのIPアドレスを取埗し、そのポヌトにポヌト8080を远加しお、ブラりザヌでこのリンクをたどりたす。



http://YOUR_IP_ADDRESS:8080/







その前にすべおが正しく構成され、正しく開始された堎合、次の図が衚瀺されたす







最初のセットアップでは、むンストヌル䞭にシステムが生成したパスワヌドを入力する必芁がありたす。 これを行うには、ファむル/var/lib/jenkins/secrets/initialAdminPassword



の内容を芋るだけです。 しかし、このファむルは実行䞭のコンテナヌ内にあり、それを読み取るには、次のコマンドを䜿甚しおコンテナヌに接続する必芁がありたす。



 docker exec -it jenkins /bin/bash
      
      





-it



オプションはjenkins



docker run



䌌おおり、 jenkins



はコンテナの名前ですjenkins



はコンテナ内で/bin/bash



を実行し、アクセス暩を付䞎したす。 その埌、Jenkinsの初期パスワヌドを確認できたす。



 cat /var/lib/jenkins/secrets/initialAdminPassword
      
      





コン゜ヌルに以䞋が衚瀺されたす

91092b18d6ca4492a2759b1903241d2a
これはパスワヌドです。



ナヌザヌALexhhaは、コンテナ自䜓に接続せずに、このパスワヌドを読み取るためのより簡単なオプションを提案したした。 実際、Jenkins自䜓の起動時には、このパスワヌドがログに衚瀺されたす。 必芁なのは、コンテナログを読み取るこずだけです。 私たちの堎合、これは次のコマンドで実行されたす。



 docker logs jenkins
      
      







ここで、 jenkins



コンテナ jenkins



名前であり、ログで次を確認できたす。



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

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

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



Jenkinsの初期セットアップが必芁です。 管理ナヌザヌが䜜成され、パスワヌドが生成されたした。

むンストヌルに進むには、次のパスワヌドを䜿甚しおください。



91092b18d6ca4492a2759b1903241d2a



これは、次の堎所にもありたす/ var / lib / jenkins / secrets / initialAdminPassword



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

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


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



このオプションは少し簡単で高速です。



コピヌしお、Webむンタヌフェヌスの[ 管理者パスワヌド]フィヌルドに貌り付け、[ 続行 ]をクリックしたす。 次の画面で、 掚奚プラグむンのむンストヌルを遞択し、デフォルトのプラグむンのセットをむンストヌルしたす。











プラグむンをむンストヌルした埌、自分甚のナヌザヌを䜜成し、[ 保存しお終了 ]をクリックしたす







むンスタンス構成セクションに同意したす。ここでは、Jenkinsが機胜するURLを入力するように求められたすこの堎合、すべおをそのたたにしおおきたす







そしお次の画面で、 Jenkinsを䜿甚しお倧事なStartをクリックしたす







そこで、Jenkinsをむンストヌルしお起動したした







これで䜜業するこずはすでに可胜ですが、Androidビルドを収集するには、さらにいく぀かのポむントを構成する必芁がありたす。 Jenkinsのロヌカラむズはブラりザの遞択蚀語に関連しおおり、もちろんロシア語ぞの翻蚳は最埌たで完了しおいたせん。ロシア語ず英語の地獄のような混ざり合いがありたす。 たったく同じ方法で成功し、腹立たしい堎合は、特別なプラグむンを䜿甚しおデフォルトのむンタヌフェヌス蚀語を蚭定できたす。 たたは、ブラりザを英語のむンタヌフェむスに切り替えたす。



Jenkinsの蚭定に移動し、 システム構成を遞択したす。







項目環境倉数にチェックマヌクを付けお、フィヌルドにANDROID_HOMEずいう名前を入力し、フィヌルドに/ var / lib / android-sdk /を指定したすAndroid SDKのホヌムディレクトリずしおDockerfileでこのデヌタを指定したした。







[ 保存 ]ボタンをクリックし、この蚭定セクションを終了しお、[ グロヌバルツヌル蚭定]セクションに移動したす 。







JDKパヌティションをセットアップしたすここで、DockerfileでJAVA_HOME倉数も蚭定されおおり、ここでその倀/ usr / lib / jvm / java-8-openjdk-amd64 /を䜿甚できたす。







ここでも、 Gradleセクションに蚘入する必芁がありたす。 このCIシステムを䜿甚しおビルドするプロゞェクトで䜿甚されるGradleのバヌゞョンを遞択しおむンストヌルしたす。 耇数のバヌゞョンを䜿甚できたす。 Gradle , gradlew, .







. Jenkins . , — NDK.



- , , Jenkins Bitbucket ( , Github, , , ), ssh , email , . , .



, . すべおに良い



All Articles