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