GitHub Actions GitHub ECブログリレー

GitHub Actionsで日々の小さな作業を自動化する

GitHub Actions GitHub ECブログリレー

EC事業部にてエンジニアリングリードを務めている @nyanyamiです。

3月よりEC事業部のエンジニアによるブログリレーを開始することになりました。 このブログリレーでは普段の業務でやっていることや、プライベートでやっている技術的なこと、仕事をうまく進めるための工夫などをこのテックブログにて公開していこうという試みです。 お題は特に設けず、内容については各メンバーにて決めていくものとなっております。

本日は1日目で、GitHub Actionsを利用した業務の小さな改善について書いていきます。

  1. GitHub Actionsとは
  2. 実際に行った自動化について
    1. 一定期間放置されたIssueをCloseする
    2. GitHub Projectsのカラム移動でラベルを付与・削除する
    3. 決まった時間にテンプレートを利用してIssueを作成する
  3. まとめ

GitHub Actionsとは

GitHub上で、プッシュ・Issue・リリースなどのイベントをトリガーに起動し、対応するアクションを組み合わせてワークフローの自動化が行える仕組みです。 ドキュメントや公開されているActionが多数あるため、これらを活用することで簡単に自動化の実装ができます。 また、Github Actionsはymlを書くだけで良いため1つサンプルを準備すると、同様の設定をエンジニア以外でも作成することができとても便利に感じています。

実際に行った自動化について

一定期間放置されたIssueをCloseする

実施理由

事業部内の人数が増えるにつれてCloseされない放置されるIssueが増えてきました。 また、放置されたIssueは本当にやらないといけないものなのかどうか、日が経つにつれ判断がつけ辛くなります。 そこで、一定期間更新されないIssueについては新陳代謝を促していきたいということでoctokitを利用したプログラムを定期的に実行して、Issueを自動Closeさせていました。 しかし、動作させていたプログラムが諸事情により動作しなくなってしまったため、Github Actionsへ切り替え作業を行いました。

下記のサンプルでは更新が30日ないIssueにclose予定というラベルを付与し、Issueにその旨をコメントします。 その後、ラベルが削除されないまま放置されたら5日後にIssueはCloseされます。 また、BacklogとついているIssueに関しては今後対応していきたい機能開発について書かれているIssueのためこのActionからは除外しています。

利用したAction

サンプル

name: "Close stale issues"
on:
  schedule:
  - cron: "0 1 * * *"

jobs:
  stale:
    name: stale
    runs-on: self-hosted
    container:
      image: ubuntu:latest

    steps:
    - uses: actions/stale@v3
      with:
        repo-token: ${{ secrets.GITHUB_TOKEN }}
        stale-issue-message: 'このissueは30日間更新がないため5日後にcloseします。closeしたくない場合は【close予定】ラベルを外してください。'
        days-before-stale: 30
        days-before-close: 5
        exempt-issue-labels: "Backlog"
        stale-issue-label: "close予定"

GitHub Projectsのカラム移動でラベルを付与・削除する

実施理由

私が担当しているCRE(Customer Reliability Engineering)チームではお客様からのお問合せに関する調査はGitHubのIssueを作成し、Projectsを利用してタスク管理しています。 Projectsのカラムとラベルを利用して進捗状況を確認していましたが、このコロナ渦により問合せが急増し、比例する形で問い合わせに関する調査が増加しました。これまでは手動で対応出来ていましたが、ラベルの付け忘れやカラムの移動忘れなどにより実際のタスク状況と相違が出てくるケースが出てきました。 作業行程を一つ減らすことでIssueの進捗状況を確実に把握出来る様にするべく、Projectsのカラムを移動させたらそれに対応したラベルを付与する運用を開始しました。 ステータスのラベルを振ることにより、自分がアサインされているIssueの検索も実施しやすくなりました。

利用したAction

サンプル

  • Actionのyml
on:
  project_card:
    types: [moved]
name: Project Card Event
jobs:
  triage:
    name: Auto card labeler
    runs-on: self-hosted
    container:
      image: ubuntu:latest
    steps:
      - uses: technote-space/auto-card-labeler@v1
  • ラベルの付与・削除設定
    • ※ 設置場所がworkflowsではないため詳しくはUsageのAdd action settingをご参照ください
Projectsの名称:
  todo:
    - 'Status: todo'
  doing:
    - 'Status: doing'
  waiting:
    - 'Status: waiting'
  done:
    - 'Status: done'

決まった時間にテンプレートを利用してIssueを作成する

実施理由

毎月実施している確認作業が複数あり、それぞれの確認手順が詳細に書かれたIssueのテンプレートを作成し比較的簡単に作成は出来る様にしていました。 毎月1日に前月の年月をタイトルに付与したIssueを作成するという作業を忘れないというタスクが発生していたため、こちらを効率化したくActionを設定しました。 GITHUB_ENVを利用して、stepの途中で毎月1日の前日(=前月)を取得し、Issue作成時のタイトルに付与しています。

利用したAction

サンプル

  • Issueのテンプレート
---
name: auto create issue
about: auto create issue test
title: '' # あとで自動付与するためここでは入れていません
labels: 'check'
assignees: '' # あとで自動付与するためここでは入れていません

---

## TODO
- [ ] todo1
- [ ] todo2
  • Actionのyml
name: Auto create issue
on:
  schedule:
  - cron: '0 0 1 * *'

jobs:
  auto_create_issue:
    name: Auto create issue
    runs-on: self-hosted
    container:
      image: ubuntu:latest
    steps:
    - name: yesterday's date
      run: echo "YESTERDAY=$(date '+%Y年%m月' --date '1 day ago')" >> $GITHUB_ENV

    - uses: imjohnbo/extract-issue-template-fields@v0.0.1
      id: extract
      with:
        path: .github/ISSUE_TEMPLATE/auto_create_issue_test.md
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - name: check issue
      uses: imjohnbo/issue-bot@v3
      with:
        assignees: "nyanyami"
        labels: ${{ steps.extract.outputs.body }}
        title:  ${{ env.YESTERDAY }} チェック用issue
        body: ${{ steps.extract.outputs.body }}
        pinned: false
        close-previous: false
        linked-comments: false

まとめ

GMOペパボではGithub Enterpriseを利用してチーム開発を行っており、Github Actionsが導入されてから様々なCI/CDを始め、ワークフローが作成されていっています。 一つ一つは小さな作業ですが、自動化する事で抜け漏れの防止ができ、よりクリエイティブな時間を捻出できます。 普段何気なくやっていることが無駄ではないかな?と目を光らせてこれからも日々の作業をカイゼンしていきたいと考えています。