GitHub Actions
転職後GitHubを使うようになり、開発環境がGitLabからGitHub Enterpriseへと変化しました。
GitLabには、GitLab CIという非常に優秀なCIツールがあり、無償で非常に柔軟性の高いCIが組めたのですが、転職に伴ってCI環境もCircle CIになりました。
そして、今度はGitHub Actionsがリリースされ、Enterpriseでも使えるようになるのは時間の問題でしょう。
その時に備えて予習しておきましょう。
なお、今回使用するリポジトリはこちらです(試行錯誤の跡が残ってます…)
https://github.com/tetsukay/github-actions-for-android
設定
Actionsの初期設定
GitHubのメニューから、Actionsを選択します。
すると、Actions Workflowのテンプレートが表示されます。
初期表示にはAndroidのワークフローはないので、少しスクロールしてテンプレートを追加表示させます。
見ていくと「Android CI」のワークフローが見つかりますので、これを選択します。
テンプレートの内容でひとまずコミットしてみます。
エラー発生
コミットしたらすぐCIが始まっています。
Actionsのページで確認してみましょう。
しかし、失敗しています。
内容を確認すると、 ./gradlew
への実行権限がないようなので、yamlを編集して実行権を与えてみます。
パーミッションを与えて再度実行を行ってみますが、今度は以下のエラーが発生しました。
Run chmod +x ./gradlew
Downloading https://services.gradle.org/distributions/gradle-5.4.1-all.zip
..............................................................................................................................
Unzipping /home/runner/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1-all.zip to /home/runner/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx
Set executable permissions for: /home/runner/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1/bin/gradle
Welcome to Gradle 5.4.1!
Here are the highlights of this release:
- Run builds with JDK12
- New API for Incremental Tasks
- Updates to native projects, including Swift 5 support
For more details see https://docs.gradle.org/5.4.1/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
File /home/runner/.android/repositories.cfg could not be loaded.
Checking the license for package Android SDK Build-Tools 29.0.1 in /usr/local/lib/android/sdk/licenses
License for package Android SDK Build-Tools 29.0.1 accepted.
FAILURE: Build failed with an exception.
Preparing "Install Android SDK Build-Tools 29.0.1 (revision: 29.0.1)".
Warning: Failed to read or create install properties file.
* What went wrong:
Could not determine the dependencies of task ':app:compileReleaseJavaWithJavac'.
> Failed to install the following SDK components:
build-tools;29.0.1 Android SDK Build-Tools 29.0.1
The SDK directory is not writable (/usr/local/lib/android/sdk)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 40s
##[error]Process completed with exit code 1.
本来SDKAndroid SDKはホームディレクトリ以下に展開されるはずなのですが、 /usr/local/lib/android/sdk
以下に配置しようとして書き込み権が無いと言われています。
このあたり を確認すると、どうやらUbuntuのイメージで発生しているようで、最新の latest
や 18.04
イメージで 改善するとの情報もありました が、現在も動作していませんでした。
仕方が無いので、ひとまず動作させることを目標として、 sudo ./gradlew build
コマンドへ変更して、ちょっと無理矢理ですが動作させます。
正常完了
若干のトラブルはあった物の、ひとまずビルドさせること自体は成功しました。
イメージ自体にSDK自体が含まれているのもあって、ほとんど空のプロジェクトで2,3分掛かっており、ビルド自体はそこまで高速ともいえない印象です。
その他
PR1の状態。ビルド成功
PR2の状態。ビルド中とビルド失敗
どちらの状態でも、マージできないということは無いんですね。
個人的には、CI中もCI失敗した後もマージをブロックしてほしい気がします。
とはいえ前職でも、どうしてもCI自体の調子が悪くなって一時的にマージを許可することもあったのですが。
また、CIが無事成功したら自動的にマージする機能が欲しいですね。( GitLabにはある )
現プロジェクトは参加人数も多く、CIが通っていざマージしようとしてみたらコンフリクトしている…なんてこともしばしばです。
Runnerのスペック
この情報は常に更新される可能性がありますが、ひとまず cpuinfo と meminfo の試した限りの情報の一部です。
CPU
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 79
model name : Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 79
model name : Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz
RAM
MemTotal: 7112216 kB
MemFree: 4993948 kB
MemAvailable: 6146864 kB
Buffers: 108536 kB
Cached: 1143656 kB
SwapCached: 0 kB
Active: 710948 kB
Inactive: 938040 kB
Active(anon): 397304 kB
Inactive(anon): 292 kB
Active(file): 313644 kB
Inactive(file): 937748 kB
Self hosted runners
GitLab CIでもできましたが、GitHub Actionsでも、利用者が用意したランナーマシンでActionsを実行することが可能なようです。
RunnerはWin, Mac, Linuxのクロスプラットフォーム対応で、クラウドサービスやローカルマシンをランナーとして動作させることが出来ます。
GitHub hostedなランナーでは性能不足だったり、同時に複数のCIを走らせたい場合にセルフランナーを追加すると良いでしょう。
試す
セルフランナーのセットアップ
まだセルフランナーについて、ドキュメントを読み込めてはいないので、できることできないことが曖昧な理解ですが、実際にセルフホストランナーを試してみます。
GCPで立ち上げたインスタンスに、GitHubのドキュメント通りにランナーをインストールします。
// Create a folder
$ mkdir actions-runner && cd actions-runner
// Download the latest runner package
$ curl -O https://githubassets.azureedge.net/runners/2.162.0/actions-runner-linux-x64-2.162.0.tar.gz
// Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.162.0.tar.gz
// Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/tetsukay/github-actions-for-android --token ACA*********************SJA
そして、トークンを指定して(設定のドキュメントに自身のトークンがすでに埋め込まれています) config
を実行するのですが
Libicu's dependencies is missing for Dotnet Core 3.0
Execute ./bin/installdependencies.sh to install any missing Dotnet Core 3.0 dependencies.
Dotnet Coreが必要というエラーが表示されました。
ご丁寧に解決法もエラーメッセージに含めてくれているので、Dotnetをインストールします。(sudo が必要です)
sudo ./bin/installdependencies.sh
その後、再度configとrunを実行します。
// Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/tetsukay/github-actions-for-android --token ACA*********************SJA
// Last step, run it!
$ ./run.sh
ジョブを受け付ける状態になっており
yuta_tetsuka@github-actions-runner:~/actions-runner$ ./run.sh
√ Connected to GitHub
2019-12-12 01:33:41Z: Listening for Jobs
GitHubのランナーページにも表示されていました。
ワークフローでのランナーの指定
Workflowを記述しているyamlで runs-on
の指定を runs-on: [self-hosted, linux, ARM64]
のような形で記述します。
実行OSやアーキテクチャの指定が無ければ、単純に runs-on: [self-hosted]
とするだけでも大丈夫です。
...と思って実行したのですが、
2019-12-12 01:57:22Z: Running job: build
ジョブを検出してセルフランナーでジョブが動作したのは良い物の、
Gitが無いと怒られてしまいました。
そういえば、RunnerをGitHubとリンクさせたとき、どういうモードで動作するかの設定が特にありませんでした。
GitLab CIでは、紐付けの際に「Runner自身のシェル」「Docker」「VirtualBox」といった動作モードを選択することができ、 Dockerを選択した場合 .gitlab-ci.yml(GitHub ActionsでいうWorkflow)
でDockerイメージを指定すると、そのイメージ上でビルドさせることが出来ます。
GitHubのセルフランナーではこの設定が無かったため、おそらくRunner自身のシェルで実行されているのでしょう。
今回作成したGCPインスタンスは、GitHub Runner以外の環境は導入していなかったため、Androidプロジェクトをビルドできる環境を整える必要があります。(が、この記事では割愛させていただきます)
Androidのビルド環境を設定しているとき、 若干のトラブルにも遭いました が、無事ビルドをセルフランナーで実行させることが出来ました。
雑感
- 様々なワークフローのテンプレートが用意されているため、GitHub hostedなランナーを用いる場合はとても簡単
- GitHubのオプションはもう少し柔軟性がほしい
- CI中のマージ不許可
- CI完了後の自動マージがほしい
- CIで生成されたテストレポートをGitHub Pagesなどにデプロイして閲覧したい
- セルフホストランナーは、まだ物たりない
- Docker Executorがほしい
- ジョブを並列で捌くため、オートスケールでVMを立てるような機能が欲しい
元々GitLab CIを使っていたところもあるのでどうしてもGitLabで出来たことが出来ないと物足りなさを感じてしまうのですが、まだまだActionsも出たばかりですので、これからの機能拡充を楽しみに待ちたいところです。
追記
@peaceiris さんにコメントでご指摘いただきました。ありがとうございます!
CI中 / Fail時のマージ不許可
Status check のブランチルールを設定することで、マージにCIの成功の制約を付けることが出来るようです。
しかし、実際に試したところ「Merge pull request」のボタンは有効化されたまま。
もう一度CIをFailさせてみたりしましたが無効化にはならず、実際にマージボタンをクリックしたらマージされてしまいました。
時間が取れ次第、もう少し詳しく探ってみるつもりです。
再度試したところ正常にマージをブロックできることを確認しました。
CIで生成されたテストレポートをGitHub Pagesなどにデプロイして閲覧したい
ActionsからGitHub Pagesにデプロイするツール がActionのWorkflowとして公開されているようです!