Github Actions でブランチの操作を行う

こちらのブログは個人ブログと同じ内容です

www.ritolab.com

少し前までは CI/CD を回そうと思ったら Circle CI や Travis CI を Github と連携させたりしていましたが、GitHub Actions が使えるようになってからは Github だけで Ci/CD も完結できるようになりました。(正式版は 2019年11月13日に提供開始)

今回は GitHub Actions を使って色々な操作を試してみたいと思います。

GitHub Actions

GitHub Actions は、Github 上でワークフローに沿ったそのリポジトリについての処理を実行させることができるサービスです。ワークフローは yml で記述します。
https://github.co.jp/features/actions

CI/CD はもちろん、そのリポジトリに関しての操作など結構色々な事が行えます。

また、よく行われているような操作に関しては、GitHub Marketplace で Action がたくさん提供されています。 自分でワークフローの全てをゴリゴリ記述しなくても、アクションを入れてしまえば済むものも多く、結構簡単に使う事ができます。

GitHub Marketplace
https://github.com/marketplace?type=actions

無料・有料それぞれで使用できる範囲

使ってみようとなると、無料だとどこまで使えるのかっていうのは気になるところです。

パブリックリポジトリに関しては、特段「課金」というものはなく無料で使えるようです。

プライベートリポジトリに関しては、無料プランを含む料金プランごとにそれぞれ「同時実行ジョブ数」「ストレージ」「実行時間」が割り当てられていて、制限を超えた場合は、課金しないとその月に関してはそれ以上使えなくなる感じになっています。

予め課金のリミットを設定しておいて、その設定金額分までは超過しても後で請求とかにもできるみたい。(リミット無制限なんて事もできる)

無料ユーザの場合、月 2000 分まで実行が可能(Linux)なので、個人で使うなら十分ですね。

ただし、消費時間の計算が、どの OS で動作させるかで異なるので、Linux 以外を使う場合は注意が必要です。 (ドキュメントに書いてある時間は Linux での動作の場合で、Windows の場合は2倍の消費、macOS の場合は 10 倍の時間消費になる。なので、無料ユーザの場合、Linux なら 2000 分、Windows なら 1000 分、macOS なら 200 分が毎月使える時間になるのか。)

どれくらい GitHub Actions を使用したかを知りたい時は、ユーザーの Settings > Billing から確認する事ができます。

f:id:ro9rito:20200608080146p:plain

ワークフローを作成する

とりあえず始めて GitHub Actions を動かしてみます。まずはワークフローを定義するためにファイルを作成します。 リポジトリに「Action」タブがあるのでこれを押下します。

f:id:ro9rito:20200608080327p:plain

ページ遷移すると、既に公開されているありがたい Workflows が沢山表示されますが、今回は使わないので set up a workflow yourself のリンクを押下します。

f:id:ro9rito:20200608080425p:plain

すると、ワークフローエディターが開くのでここから アクションを定義していく事ができます。

f:id:ro9rito:20200608080457p:plain

これをそのまま保存します。

f:id:ro9rito:20200608080526p:plain

再度 Actions タブに遷移すると、ワークフローの一覧が表示されていて、詳細を確認する事ができます。

f:id:ro9rito:20200608080600p:plain

無事に GitHub Actions を動作させる事ができました。

f:id:ro9rito:20200608080631p:plain

ちなみに今回は手っ取り早く Github 上からファイルを作成しましたが、以下のパスで yml ファイルを作成してリモートリポジトリに push するでも OK です。
.github/workflows/FILE_NAME.yml

Github Actions でブランチの操作を行う

ワークフローを定義できるようになったので、色々操作してみたいと思います。

Github Actions は公式ドキュメントが充実しているので、基本操作はそちらを読むと良いと思います。

Github Actions リファレンス
https://help.github.com/ja/actions/reference

ブランチを作成する

自動でブランチを切りたい時とかってありますよね。

dev ブランチに push したら release ブランチを作成するようにしてみます。

name: create new branch

on:
push:
branches: [ dev ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: checkout dev
uses: actions/checkout@v2
with:
ref: dev

- name: Create new Branch
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git checkout -b release
git push origin release

step 配下に 2つのアクションを定義しました。

  • dev ブランチをチェックアウトする
  • 新しいブランチを作成し、リモートリポジトリへプッシュする

これだけで勝手にブランチを切ってくれるので簡単です。 ポイントは Github の token を env に登録しておく事くらいです。

今回は run を定義しましたが、Marketplace にもブランチを切るアクションが公開されているので、やりたい事がそれで実現できるならそちらを使っても良いと思います。

タイムゾーンを設定する

なんだかこのままでは味気ないので、自動で作成されるブランチに日付をつけるようにしてみます。

- name: Create new Branch
env:
TZ: 'Asia/Tokyo'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DATE=`date +"%Y%m%d"`
BRANCH_NAME="release_$DATE"
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"

タイムゾーンUTC なので、日本時間に合わせるために環境変数タイムゾーンを設定しています。

プルリクを作成する

ブランチ切ったらプルリク出したい欲が湧いてきたので、やってみます。

name: create branch & pull request

on:
push:
branches: [ dev ]

jobs:
build:
runs-on: ubuntu-latest

steps:
# hub コマンドをインストールする
- name: install hub
uses: geertvdc/setup-hub@v1.0.0

# dev ブランチをチェックアウトする
- name: checkout dev
uses: actions/checkout@v2
with:
ref: dev

# ブランチを作成する
- name: Create Branch
id: create_branch
env:
TZ: 'Asia/Tokyo'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DATE=`date +"%Y%m%d"`
BRANCH_NAME="release_$DATE"
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
echo ::set-output name=branch_name::$BRANCH_NAME

# プルリクを作成する
- name: Create Pull Request
env:
REVIEWERS: "rito328"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_NAME: ${{ steps.create_branch.outputs.branch_name }}
run: |
hub pull-request -m "Github Actions からプルリクを出す" -b master -h $BRANCH_NAME -l "PR:draft" -r "$REVIEWERS"

プルリクをコマンドで投げるために hub コマンドをインストールしてそれでやっています。

ブランチ名をプルリクの step へ渡すために以下の事を行っています。

  • ブランチ作成 step に id を設定
  • アクションの出力パラメータを設定

出力パラメータの設定は、以下の部分です。

echo ::set-output name=branch_name::$BRANCH_NAME

これで、別の step の出力を別の step から参照する事ができるので、プルリクSTEP の env 設定時にこの出力を取り出して設定しています。

この辺りは以下のリファレンスが参考になります。

GitHub Actionsのワークフローコマンド

これを実行すると、プルリクが作成されます。

f:id:ro9rito:20200608081805p:plain

ちなみに pull request の作成も、Marketplace にアクションが多数公開されているので、気に入るものを探してみると良いと思います。

Slack 通知を行う

プルリクを出したら、それを伝えたい欲が湧いてきました。slack でこの事を通知しようと思います。

name: create branch & pull request

on:
push:
branches: [ dev ]

jobs:
build:
runs-on: ubuntu-latest

steps:
# hub コマンドをインストールする
- name: install hub
uses: geertvdc/setup-hub@v1.0.0

# dev ブランチをチェックアウトする
- name: checkout dev
uses: actions/checkout@v2
with:
ref: dev

# ブランチを作成する
- name: Create Branch
id: create_branch
env:
TZ: 'Asia/Tokyo'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DATE=`date +"%Y%m%d"`
BRANCH_NAME="release_$DATE"
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
echo ::set-output name=branch_name::$BRANCH_NAME

# プルリクを作成する
- name: Create Pull Request
id: create_pull_request
env:
REVIEWERS: "rito328"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_NAME: ${{ steps.create_branch.outputs.branch_name }}
run: |
RESULT=`hub pull-request -m "Github Actions からプルリクを出す" -b master -h $BRANCH_NAME -l "PR:draft" -r "$REVIEWERS"`
echo ::set-output name=url::$RESULT

# メッセージを作成する
- name: create message
id: create_message
env:
BRANCH_NAME: ${{ steps.create_branch.outputs.branch_name }}
URL: ${{ steps.create_pull_request.outputs.url }}
run: |
MESSAGE="$BRANCH_NAME ブランチを作成してプルリクを出しました $URL"
echo ::set-output name=message::$MESSAGE

# slack で通知する
- name: Post to slack
uses: novoda/github-slack-action@master
with:
color: good
text: ${{ steps.create_message.outputs.message }}
webhook: ${{ secrets.SLACK_WEBHOOK }}

slack 通知に関しては、Marketplace にアクションが沢山公開されているので、その中から気に入ったやつを選んで使うと手っ取り早いですね。

(ただ、どのアクションもあれこれ詳細な通知を出したがるので、なかなかシンプルなやつがなかった)

GitHub Marketplaceからのアクションの利用

これもさっきのプルリクの時とさほどかわりません。 hub コマンドでプルリクを出すコマンドを実行すると、プルリクの URLが返ってくるので、それを出力してメッセージに含ませます。

slack 通知は Marketplace で公開されているアクションを使ったので、一度メッセージ作成の STEP を設けてメッセージを組み立てて、slack 通知 STEP で引数としてそれを渡しています。

これで slack 通知が行われるようになりました。

f:id:ro9rito:20200608082019p:plain

スケジュールで動作させる

これまでは、dev ブランチへの push をトリガーとしてワークフローが動作するようにしていましたが、決まった日時や曜日でこれを動作するようにしてみます。

on:
schedule:
- cron: '*/15 * * * *'

push:
branches: [ dev ]

これで、プッシュのトリガーとは別に、スケジュールでもこのワークフローが稼働するようになりました。cron と同じ書式っていうのが、見慣れているのでなかなか良いですね。

トリガー(ワークフローを実行するきっかけ)に関しては、以下に解説があります。

ワークフローをトリガーするイベント

まとめ

Github Actions が登場する前までは、別の CI サービスと連携しなければならなかったので、連携コストだったり、CI の方のサービス自体が調子悪いとかで開発に影響が出たりとか、なかなかツラいポイントもありましたが、Github Actions は簡単な上にコード管理と一気通貫で CI/CD を管理できるのでとても良いサービスだと思います。

テスト回したりデプロイしたりもまた次回やってみましょう。

GitHub Actionsのドキュメント
https://help.github.com/ja/actions