ロコガイド テックブログ

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの社員がいろいろな記事を書いています。

CircleCI API v2で柔軟なCI/CD環境を構築したい!!

f:id:yokomii:20190826110036p:plain

こんにちはーーー!!!>👭🚲
技術部でモバイルアプリエンジニアを務めております、横山(yokomii)です。
日頃、買い物情報アプリ「トクバイ」のAndroid版の開発に勤しんでいます。

さてさて、皆さんはアプリのCI/CD環境をどのように構築していますでしょうか?

トクバイAndroid版のCI構成はざっくり以下のようになっています。

f:id:yokomii:20190826110115p:plain

主な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の呼び出しは可能です。しかし・・

Using the API to Trigger Jobs
f:id:yokomii:20190826110112p:plain

executorsやcommandsを使うと処理が整理されて最高ですよね🤤

CircleCI API Preview(v2)を使おう

ということで、要件が満たせそうな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してみると・・

f:id:yokomii:20190826110121p:plain

debugフローのみが実行されました!

CircleCIの設定

  • Project settingの AdvancedSetting > Only build pull requests をOffに設定します。
    これによりAPI経由でのビルドが有効になります。

f:id:yokomii:20190826110125p:plain

f:id:yokomii:20190826110118p:plain

リクエストする

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_buildtrueを設定します。

結果

  • releaseフローが単体実行されます。

f:id:yokomii:20190826110131p:plain

やったね✌️✌️

まとめ

任意のworkflowを自由なタイミングで実行できるようになると、より柔軟なCI/CD環境を構築することができますね🤗
トクバイのCI/CD環境もまだまだ模索段階ですので、 おすすめのツールや、こうするともっと良くなるよ〜というアドバイスがあれば是非コメントください!!

ロコガイドではCI/CD環境構築に意欲があるorこれから頑張りたいモバイルエンジニアを募集中です。
興味のある方は下記のリンクからお気軽にご応募ください。

リクルート | 株式会社ロコガイド