Jenkins内のDockerでAndroidをコンパイルする(ほぼ!)

この記事はN部作の第2部です。Docker内のJenkinsでAndroidアプリをコンパイルしようとする私の最初のステップについて扱います。QNAP NAS上のDocker内にJenkinsサーバーを設定し、このプロジェクトがもっと大きなものになる可能性に気づいた初期の段階をカバーします...

ステップ1: サーバーの作成とGitHubに接続する

まず最初に、Docker Hubにアクセスして公式のJenkinsイメージを探す必要がありました:https://hub.docker.com/r/jenkins/jenkins

これには、私のQNAP NASのコンテナステーションでパイプラインを設定するために必要な全てが含まれていて、なお良いことに、JDKがすでにインストールされているタグがあります - これはAndroidアプリをビルドするのに完璧かもしれませんね?(ネタバレ、そうではありませんでした!)

それでは、jenkins/jenkins:lts-jdk17イメージをローカルのNASに持っていきましょう...

Jenkinsがコンテナステーションでダウンロードされた

よし、ここまでは良い感じです。次に、コンテナの再起動の間にデータが失われないように、Jenkinsサーバーの将来のホームディレクトリ用の新しいボリュームを作成しましょう。

ホームディレクトリのボリュームを作成

そして、基本的な事項が済んだら、サーバーが動作するコンテナを作成する良い部分に進むことができます。まずは、コンテナステーションに先ほどダウンロードしたイメージを使うことを伝えましょう。

イメージ選択ダイアログ

次に、コンテナを名前で設定し、ポート8080が公開されるようにしましょう(ただし、このセットアップで私たちのメインサーバーにJenkinsワーカーを接続させたくはないので、ポート50000は公開しないでください)

コンテナ設定

そして必要ないと思われるものを考えると...メディアサーバーでもあるため、RAMへの完全アクセスはおそらく過剰かもしれませんので、現時点では1GBに制限してロードがどのように対処されるか見てみましょう:

メモリの制限

最後のステップで、先ほど作成したボリュームを使ってホームディレクトリを設定しましょう:

ホームディレクトリボリュームの設定
そしてビンゴ!

Jenkinsウェルカムスクリーン

初期セットアップウィザードが済んだら、最初のパイプラインを作成するのは簡単です!SSHキーを追加して私のリポジトリをクローンしましょう...ああ。わかりました、問題は普通に発生し、予期されていたものです。

ホストキーがないエラー

さて、Google, StackExchangeを見て...あっ、見つけた!

コンテナ内のターミナル経由で少しSSHの魔法をかけると、ボイラ!

GitHubを既知のホストに追加

git内のJenkinsfileに保存されている当社のスクリプトを再度実行してみましょう...

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
                sh './gradlew clean build'
            }
        }
    }
}

エクスプローラーモードを終了する

そしてビジネスが成立しました!

Gradleが起動

しかし、おや。これは来るべきだった...JenkinsにはJDKが含まれているかもしれませんが、確実にAndroid SDKは含まれていません...そのためビルドは失敗します...

Android SDKが見つからない

これは、新しいDockerfileを書くほど簡単なことかもしれません...しかし、正直なところ、このチュートリアルは実際に役立つものに近いです。

このプロジェクトを始めた時には目標がありましたが、なぜ私のAndroidアプリだけをビルドできる一発屋を作るべきでしょうか?TypeScriptや.NETを書いたらどうなるのでしょうか?いつもJenkinsサーバーを再開始するか、大きく複雑なDockerfile/イメージを作るでしょうか?

いや、私たちは、それよりも良いことをすることができますし、するべきです:

  • コンテナで動作するJenkinsサーバー - すでに済み ✔
  • Dockerfiles/イメージで定義されたエフェメラルなJenkinsコンテナエージェントで実行されるビルド - これは私も以前にやったことがあります ✔
  • ホストのdockerを管理するdockerがインストールされたコンテナ - これも私が以前にやったことがあります ✔

この結果になるはずです:

  • 私のJenkinsサーバーを作成する方法を定義する単一のDockerfileで、それをgitに保存が可能です!
  • 必要なツールを全て含むことができる、プロジェクトごとのDockerfile/イメージの参照で、それをgitに保存が可能です!

この小さなプロジェクトの起源を考慮すると、私は納得しています!私のビルドシステムは、ほぼ完全にコードとして定義され、再現可能です。

第3部まで

生きて学ぶ

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/dotdashnotdot/compiling-android-in-jenkins-in-docker-nearly-516