CircleCIとDeployGateで自動化を少し進めてみる


アプリをリリースして、アップデートするたびに手順が多くてめんどくさいと思い、自動化について調べてみて、少しやってみた備忘録です。

使用ツール

CircleCIとDeployGateを使いました。
流れとしては、githubにソースコードをプッシュもしくはマージされると、ビルドとテストを実行し、問題なければDeployGateで最新の状態のアプリがダウンロード可能になるというものです。

ツールを使えるようにする

CircleCIとDeployGateをインストールします。
手順は割愛しますが、両方とも無理プランで登録しました。
CircleCIは無料プランだと1コンテナまでなので、必要に応じてプランを上げる必要があるかもしれません。

ymlの作成

ymlファイルを作成して、DeployGateに上げるまでの手順を記載します。

①aliasの作成

場合によっては同じ手順が存在するかと思いますので、呼び出せるようにまとめます。
ymlでは&nameで名前をつけて*nameで参照することができる

config.yml
aliases:
  android_docker: &android_docker
    docker:
      - image: circleci/android:api-27
        environment:
          TZ: Asia/Tokyo
  steps:
    - restore_cache: &restore_cache
        key: &jars_key jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}
    - run: &download_deps
        name: Download dependencies
        command: sudo chmod +x ./gradlew
    - save_cache: &save_cache
        paths:
          - ~/.gradle
        key: *jars_key
    - run: &build_debug_apk
        name: Build debug APK
        command: ./gradlew assembleDebug
    - run: &test
        name: test
        command: ./gradlew test
    - run: &upload_to_deploy_gate
        name: Upload to DeployGate 
        command: |
          APK_PATH=app/build/outputs/apk/debug/app-debug.apk
          curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "token=${DEPLOY_GATE_API_KEY}" -F "message=Build by CircleCI" (DeployGateURL)

aliases:でバージョン指定、steps:でのちに行う手順をまとめています。ビルドやデプロイのコマンド等をまとめています。

②ワークフローの作成

次に、ビルドしてからDeployGateにアップロードするまでのワークフローを記載します。

config.yml
version: 2
jobs:
  build:
    <<: *android_docker
    steps:
      - checkout
      - restore_cache: *restore_cache
      - run: *download_deps
      - save_cache: *save_cache
      - run: *build_debug_apk
  test:
    <<: *android_docker
    steps:
      - checkout
      - restore_cache: *restore_cache
      - run: *download_deps
      - save_cache: *save_cache
      - run: *test
  deploy:
    <<: *android_docker
    steps:
      - checkout
      - restore_cache: *restore_cache
      - run: *download_deps
      - save_cache: *save_cache
      - run: *build_debug_apk
      - run: *upload_to_deploy_gate

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - test
      - deploy:
          requires:
            - build
            - test
          filters:
            branches:
              only: master
          context: (DeployGateで設定した値)

workflows:が実行する順序で、Jobsが何をするかの記載です。
今回の場合だと、Githubからチェックアウトし、ビルドとテストを実行し、問題なければDeployGateに上げるという流れにしています。
workflows:では実行するための条件を少し加えています。
requires:で必要条件を設定しています。
ビルドとテストが成功しないと先に進まないようにしました。
そして、only:masterでマスターブランチに変更が入った場合のみ実行するようにしています。
最後のcontextはDeployGateで設定するもので、設定したcontextで①で使った${DEPLOY_GATE_API_KEY}を設定しています。

簡単に記載しましたが、ドキュメントが詳しいので、ある程度のことは載っていると思います。
また、DeployGateに自動的に更新されたアプリが表示されたときは自動化っていいなあと思いました。
リリースするまでに多くの手順が存在するため、少しでも簡略化できるなら使ったほうがいいなあと思いました。

参照

プログラマーのための YAML 入門 (初級編)
CircleCIのドキュメント