こんにちはーーー!!!>👭🚲
技術部でモバイルアプリエンジニアを務めております、横山(yokomii)です。
日頃、買い物情報アプリ「トクバイ」のAndroid版の開発に勤しんでいます。
さてさて、皆さんはアプリのCI/CD環境をどのように構築していますでしょうか?
トクバイAndroid版のCI構成はざっくり以下のようになっています。
主なCIツールとして
1. CircleCI
2. Wercker
の二種類を使い分けています。
CircleCI
はGitHubと連携してPushをフックして
自動ビルド、UnitTest/lintチェック、テストアプリの配信などを実行し、
Wercker
はSlackBot経由でAPIを呼び出すことで
APKの生成、StoreへのDeployを自動実行します。
CIツールを一本化(CircleCI)したい!
これらのCIツールを一本化し、設定を一箇所に集約したい!
特に、複雑なworkflow設定をyml上で完結させられる CircleCI
に統一したい!
という想いを常々抱えており、Werckerからの移行に踏み切ることにしました。
そのために必要な要件は以下の通りです。
1. 任意のタイミング(bot経由)でRunできる 2. 実行するworkflowを選択できる(必要なときだけReleaseBuild/Deploy) 3. 任意のブランチを指定できる
まず、任意のタイミング(bot経由)でRunできる
を実現するために
CircleCI APIの利用を試みました。
しかし、pipeline上の全workflowsをトリガーするAPIは存在するものの、
任意のworkflowを単体実行できるAPIは存在しない。すなわち、
実行するworkflowを選択できる(必要なときだけReleaseBuild/Deploy)
の要件を満たせないことがわかりました。
💡Tips:
workflowの任意実行は不可能ですが、単体jobの呼び出しは可能です。しかし・・
executorsやcommandsを使うと処理が整理されて最高ですよね🤤
CircleCI API Preview(v2)を使おう
- https://github.com/CircleCI-Public/api-preview-docs
- CircleCI v2.1に対応
- pipeline-parametersを指定することでworkflowを任意実行できる
- Preview版なのでご利用は計画的に
ということで、要件が満たせそうなPreview版APIを使ってみることにしました。
(VCSはGitHubを前提としています)
config.yml
version: 2.1 parameters: run_release_build: type: boolean default: false executors: default: working_directory: /tmp/workspace docker: - image: circleci/android:api-28 jobs: assemble_debug: executor: name: default steps: - checkout - run: name: Build debug APK command: ./gradlew assembleDebug assemble_release: executor: name: default steps: - checkout - run: name: Build Rlease APK command: ./gradlew assembleRelease workflows: version: 2 debug: unless: << pipeline.parameters.run_release_build >> jobs: - assemble_debug release: when: << pipeline.parameters.run_release_build >> jobs: - assemble_release
大きなポイントは以下の二つです
① workflowを任意実行するためのフラグを設定する
parameters: run_release_build: type: boolean default: false
② when/unless句で処理分岐させる
debug: unless: << pipeline.parameters.run_release_build >> jobs: - assemble_debug release: when: << pipeline.parameters.run_release_build >> jobs: - assemble_release
上記の制御により、GitHub経由でWebhookが通知されたときは release
フローは実行されなくなります。
試しにPushしてみると・・
debugフローのみが実行されました!
CircleCIの設定
- Project settingの
AdvancedSetting
>Only build pull requests
をOffに設定します。
これによりAPI経由でのビルドが有効になります。
- User setting > Personal API Tokens で APIトークンを発行します。
リクエストする
Passing parameters when triggering pipelines via the API
curl -u ${PERSONAL_API_TOKEN}: -X POST --header "Content-Type: application/json" -d '{ "branch”:${対象のブランチ名}, "parameters": { "is_release_build": true } }' https://circleci.com/api/v2/project/github/${GitHubの組織orユーザー名}/${リポジトリ名}/pipeline
branch
にはCIを実行するブランチ名を設定します。(デフォルトはmaster)- config.ymlで定義した
is_release_build
にtrue
を設定します。
結果
- releaseフローが単体実行されます。
やったね✌️✌️
まとめ
任意のworkflowを自由なタイミングで実行できるようになると、より柔軟なCI/CD環境を構築することができますね🤗
トクバイのCI/CD環境もまだまだ模索段階ですので、 おすすめのツールや、こうするともっと良くなるよ〜というアドバイスがあれば是非コメントください!!
ロコガイドではCI/CD環境構築に意欲があるorこれから頑張りたいモバイルエンジニアを募集中です。
興味のある方は下記のリンクからお気軽にご応募ください。