• トップ
  • ブログ一覧
  • 開発効率を少しだけ上げるGithubActionsの便利な使い方
  • 開発効率を少しだけ上げるGithubActionsの便利な使い方

    笹川(エンジニア)笹川(エンジニア)
    2023.09.20

    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も同時に実行しているので、そちらが邪魔であればFastfilegradle(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_titlepr_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開発した際の記事はこちら

    featureImg2020.03.24Androidのライブラリを作って公開してみたアプリ開発に少し飽きてきたから違うなにかを開発したい!笹川先生(株)ライトコードでモバイルアプリケーション開発をしてい...
    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事