開発効率を少しだけ上げるGithubActionsの便利な使い方
IT技術
普段使ってるGithub ActionsのWorkflowを紹介
(株)ライトコードでモバイルアプリケーションメインで色々開発している笹川(ささがわ)です!
今日は普段私が業務や個人開発で利用しているGithub ActionsのWorkflowをいくつか紹介したいと思います。
リリースノートを自動で生成してくれる
release-drafterというWorkflowを使えば簡単にできます。
これは結構有名で使っている方も多いと思います!
使い方としては.github/
と.github/workflows/
にそれぞれ release-drafter.yml
を作成し、ぞれぞれ下記の様に記載します。
.github/release-drafter.yml
こちらではPRに付けたLabelを元にどのような変更のカテゴリになるかの設定やリリースバージョンをどの単位で自動生成していくかを設定しています。
1name-template: 'v$RESOLVED_VERSION'
2tag-template: 'v$RESOLVED_VERSION'
3categories:
4 - title: '🚀 Features'
5 labels:
6 - 'feature'
7 - 'enhancement'
8 - title: '🐛 Bug Fixes'
9 labels:
10 - 'fix'
11 - 'bugfix'
12 - 'bug'
13 - title: '🔓Security'
14 label: 'security'
15 - title: '😐 Maintenance'
16 labels:
17 - 'chore'
18 - 'test'
19 - 'refactoring'
20 - 'dependencies'
21change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
22version-resolver:
23 major:
24 labels:
25 - 'major'
26 minor:
27 labels:
28 - 'minor'
29 patch:
30 labels:
31 - 'patch'
32 default: patch
33template: |
34 ## Changes
35 $CHANGES
.github/workflows/release-drafter.yml
こちらではどのタイミングでリリースノートの生成を行うかの定義をしています。
こちらの設定だと develop
ブランチにマージされたタイミングで実行されるようになっています。
運用によっては main
ブランチにするなどができます。
1name: Release Drafter
2
3on:
4 push:
5 branches:
6 - develop
7
8jobs:
9 build:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: release-drafter/release-drafter@v5
13 env:
14 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
正直、Workflowの中では少し手間な部分がありますが、それでも自分で「あれ、このリリースに含まれるのはどれだっけ?このPRはどんな修正だっけ?」と全てのPRを再確認するよりは圧倒的に作業効率は良くなりますね!
PR作成時にDangerを動かしてLint実行
DangerというRuby製のLintを実行してくれるツールがあります。
こちらはGithub Actionsが登場する前から広く使われており、様々な言語やFWで使うことができます。
少し名前が物騒ではあるのですが、とても便利なのでぜひ知っていただきたいです。
今回はAndroidアプリケーション開発で良く使われているKtlintを利用する想定で紹介します。
他の言語についてはDangerのドキュメントに利用方法が書いてありますので、そちらをご覧ください。
.github/workflows/pull_request.yml
こちらはrelease-drafterみたいに専用のworkflowがないので、自分でymlに書いていく必要があります。
develop
ブランチとfeature
ブランチに対してPRが作成されたら実行され、Dangerのインストールと実行までを定義しています。
1name: Android CI
2
3on:
4 pull_request:
5 branches: [ develop, "feature*" ]
6
7jobs:
8 build:
9
10 runs-on: ubuntu-latest
11
12 steps:
13 - uses: actions/checkout@v2
14 - name: set up JDK 11
15 uses: actions/setup-java@v1
16 with:
17 java-version: 11
18 - name: Set up Ruby 2.6.0
19 uses: ruby/setup-ruby@v1
20 with:
21 ruby-version: 2.6.0
22 - name: Install
23 run: |
24 gem install bundler
25 bundle install --jobs 4 --retry 3
26 curl -sSLO https://github.com/pinterest/ktlint/releases/download/0.36.0/ktlint
27 chmod a+x ktlint
28 sudo mv ktlint /usr/local/bin/
29 - name: Run Unit Test
30 run: |
31 bundle exec fastlane unit_test
32 env:
33 GITHUB_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKENCI }}
これだけだとDanger自体の実行ができないので他に必要なファイルも用意します。
私の環境ではCLIツールのFastlaneを利用しているので、そちらも導入しております。
モバイルアプリケーションじゃない場合はFastlaneは使わず、Dangerのドキュメントにある様にymlファイルを定義してもらえれば動くはずです。
他の必要なファイルは複数あるのでこれらのファイルをそれぞれ参照してください。
Androidのネイティブアプリではコピペでほぼ利用できるかと思います。
私の環境ではUnitTestも同時に実行しているので、そちらが邪魔であればFastfile
の gradle(task: "library:test")
を削除してください。
mainブランチとdevelopブランチの差分を自動でPR作成してくれる
hotfixなどでmainブランチにマージした場合、developブランチにマージする必要がありますが、意外と忘れがちです。
これを自動生成してもらうことで差分が開いてからの取り込みを防ぐことで、コンフリクトや先祖返りなどのリスクも減らすことができます。
.github/workflows/master-diff.yml
こちらもrelease-drafterみたいに専用のworkflowがないので、自分でymlに書いていく必要があります。
1on:
2 push:
3 branches:
4 - master
5
6jobs:
7 master-to-develop-pr-auto-creator:
8 runs-on: ubuntu-latest
9 steps:
10 - uses: actions/checkout@v3
11
12 - name: Check change
13 run: |
14 git fetch
15 echo "::set-output name=CHANGED::$(git diff --name-only "origin/develop" "origin/master" -- | wc -l | awk '{print $1}')"
16 echo "::set-output name=COMMIT_HASH::$(git rev-parse HEAD)"
17 id: check-change
18
19 - name: Create branch
20 if: ${{ steps.check-change.outputs.CHANGED > 0 }}
21 run: |
22 git checkout -b "fix/${{ steps.check-change.outputs.COMMIT_HASH }}"
23 git push origin "fix/${{ steps.check-change.outputs.COMMIT_HASH }}"
24 - name: Create pull-request
25 if: ${{ steps.check-change.outputs.CHANGED > 0 }}
26 uses: repo-sync/pull-request@v2
27 with:
28 source_branch: "fix/${{ steps.check-change.outputs.COMMIT_HASH }}"
29 destination_branch: "develop"
30 github_token: ${{ secrets.GITHUB_TOKEN }}
31 pr_title: "Merge diff of Master for Develop"
32 pr_body: "Auto Create PR"
33 pr_label: "master-diff"
pr_title
とpr_body
は好きに記載してください。日本語も書けますよ。
pr_label
はLabelを作成し、それに紐づく様に設定しています。
おまけ READMEの肥大化はGithub Pagesを使おう
アプリケーションが育ってくるとREADMEに記載される内容が肥大化していきます。
Wikiを使う方法もありますが、Git管理したいケースもあると思います。
その場合はGithub Pagesを使えば解決できます!
登場した時点ではpublicリポジトリのみの対応でしたが、今ではprivateリポジトリでも利用可能になっております。
詳しい設定方法などはGithub Pagesの公式ドキュメントを参照してください。
笹川はソースコードのドキュメント(Jdoc)の様なものをKotlinで使える様にして利用しております。
https://sasa-nori.github.io/common-ktx/
人の手でやらなくていいのはやらなくていいいんです!
いかがだったでしょうか?
今日にでもコピペで使えるものもあったかもしれませんね。
笹川の個人開発しているOSSでも今回のWorkflowは全て導入されておりますので、そちらを参考にしてください。
https://github.com/sasa-nori/common-ktx
OSS開発した際の記事はこちら
2020.03.24Androidのライブラリを作って公開してみたアプリ開発に少し飽きてきたから違うなにかを開発したい!笹川先生(株)ライトコードでモバイルアプリケーション開発をしてい...ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!