これはactindi Advent Calendar 2019、1日目の記事です。
こんにちは!Androidアプリエンジニアのhondaです。
今日でactindi勤続4年になりました。
今回は開発中のアプリをメンバーに配布するためにGitHub Actionsを使ってみたときのことをつらつらと書きたいと思います。
GitHub Actions、使ってよかった。
Android版いこーよでは今までCIでbitriseを使っていました。
もともと、GitHub Actionsを使ってみた理由がビルド時間が短縮できるかを検証するためでした。
ビルド時間を比較したところ2分ほど短縮することができました。
また、bitriseよりGitHub Actionsのほうがビルドが安定しているようなのでとても好印象でした。
Android版いこーよでは今後もGitHub Actionsを使っていこうと思っています。
GitHub Actionsとは?
GitHubアクションは、ワークフローのすべてのステップに統合された強力な実行環境を備えています。任意のジョブを実行するアクションを検出、作成、共有し、それらを組み合わせてワークフローをカスタマイズできます。
※公式のヘルプページより抜粋したものを翻訳しました。
つまり、GitHubのリポジトリ上でのアクションをトリガーにワークフローを実行して、ワークフローの中でビルドして配信したり、LintチェックしてPRに結果を載せたり、テストを実行したりすることができるCI環境です。
参考にしたもの
サクッとGitHub ActionsのWorkFlowを定義する一連の流れを理解できます。
公式のヘルプページです。 日本語ドキュメントもありますが、まだ途中だったりするので英語ページでGoogle Translationで翻訳したほうが読みやすいような気がします。
使ってみた
1.GitHubのRepositoryのトップページのActionsタブをクリック。
2.New workflowをクリック。
3.「Popular continuous integration workflows」の中に「Android CI」というworkflowが用意されているのでそれの「Set up this workflow」をクリック
4.workflowが定義されているymlファイルの編集画面が表示されるので、右上の「Start commit」をタップするとmasterにymlファイルがプッシュされます。
5.デフォルトだとworkflowが実行される条件が on: [push]となっています。つまり、「Start commit」をタップするとworkflowが実行、ビルドが始まります。
6.最後に今回はデバッグビルドを試したので最後のビルドコマンドは ./gradlew assembleDebug
に変更します。
ここまでやって、冒頭のビルド時間の短縮を確認することができました。
ですが、このままではいろいろ足りないのでworkflowを改修していきます。
出来上がったAPKファイルをDeployGateに配信したい。
Android版いこーよではデバッグ版APKファイルをDeployGateにアップロードして関係者に配布しています。GitHub Actionsでも同じように配信したいと思います。
run
コマンドでシェルを実行できます。
ドキュメント
WorkFlowに追加
ymlファイルの最後に以下を追加します。
- name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=https://github.com/${{secrets.GITHUB_USER}}/${{secrets.GITHUB_REPOSITORY}}/commit/`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/${{secrets.DEPLOYGATE_USER}}/actindi/apps
WorkFlowが終了したらslackに通知したい
今回は以下の2つを使ってみました。
Slack Notify
- slackのWebHookで連携できるので導入が楽
- ビルド時間が1分ほどかかる
Post Slack messages
- slackとはボットユーザトークンで連携
- ビルド時間が30秒ほど
WorkFlowに追加
今回はSlack Notifyを使いました。
ymlファイルの最後に以下を追加します。
- name: Slack Notification uses: rtCamp/action-slack-notify@master env: SLACK_CHANNEL: ${{secrets.SLACK_CHANNEL}} SLACK_COLOR: '#008000' SLACK_TITLE: ':rocket::rocket::rocket: Finished distribute to deploygate! :rocket::rocket::rocket:' SLACK_MESSAGE: 'Finished distribute to deploygate! Please check deploygate!' SLACK_USERNAME: GitHub Actions SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}
ビルドが失敗したときもslackに通知したい
if: failure()
で直前のステップが失敗した場合に実行することができます。
ドキュメント
WorkFlowに追加
ビルドステップのあとに以下を追加します。
- name: Slack Notification when build failed if: failure() uses: rtCamp/action-slack-notify@master env: SLACK_CHANNEL: mobile_app_ci SLACK_COLOR: '#ff0000' SLACK_TITLE: ':fire::fire::fire: Build error! :fire::fire::fire:' SLACK_MESSAGE: "Build error! Please check github!" SLACK_USERNAME: GitHub Actions SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}
master以外のブランチに対するpushでworkflowを実行するようにする
branches-ignore
にmasterを設定するとmaster以外のブランチに対するpushでworkflowが実行されます
ドキュメント
WorkFlowに追加
on.push
のあとにbranches-ignore
を追加します。
on: push: branches-ignore: - 'master'
出来上がったWorkFlow
name: Android CI on Push on: push: branches-ignore: - 'master' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew assembleDebug - name: Slack Notification when build failed if: failure() uses: rtCamp/action-slack-notify@master env: SLACK_CHANNEL: mobile_app_ci SLACK_COLOR: '#ff0000' SLACK_TITLE: ':fire::fire::fire: Build error! :fire::fire::fire:' SLACK_MESSAGE: "Build error! Please check github!" SLACK_USERNAME: GitHub Actions SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}} - name: Distribute App run: | curl \ -F "token=${{secrets.DEPLOYGATE_TOKEN}}" \ -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ -F "message=https://github.com/${{secrets.GITHUB_USER}}/${{secrets.GITHUB_REPOSITORY}}/commit/`git rev-parse --short $GITHUB_SHA`" \ -F "distribution_name=$GITHUB_HEAD_REF" \ https://deploygate.com/api/users/${{secrets.DEPLOYGATE_USER}}/apps - name: Slack Notification uses: rtCamp/action-slack-notify@master env: SLACK_CHANNEL: mobile_app_ci SLACK_COLOR: '#008000' SLACK_TITLE: ':rocket::rocket::rocket: Finished distribute to deploygate! :rocket::rocket::rocket:' SLACK_MESSAGE: 'Finished distribute to deploygate! Please check deploygate! https://deploygate.com/users/${{secrets.DEPLOYGATE_USER}}/apps/${{secrets.DEBUG_APPLICATION_ID}}/binaries' SLACK_USERNAME: GitHub Actions SLACK_WEBHOOK: ${{secrets.SLACK_WEBHOOK}}
We are hiring!
ここまで読んでくれてありがとうございます!
アプリチームでは仲間を募集しています!
とりあえず話を聞いてみたいでも構いません!
五反田でお待ちしております!
それではよいクリスマスを!