Open5
GitHub Actionsについてまとめる
全体像
GitLab CIなどと同様にイベント駆動型で指定されたイベント(プッシュやコミット、マージリクエスト等)が発生した後に任意の処理を実行することができる。
構成要素としては以下
- Workflow
- 一連の処理をまとめた単位で、複数のJobで構成される
- この後触れるが、Workflowの実体はリポジトリに格納するワークフローファイル
- Event
- Workflowを実行するトリガーとなるもの
- Eventの一覧についてはワークフローをトリガーするイベント - GitHub Docs を参照
- Job
- ジョブ単位で同じランナーで処理が実行される。デフォルトでは各ジョブは平行に実行されるが、順番順を指定することもできる。(例えば、ビルドとテストを順番に実行させ、ビルドが失敗した場合にはテストは実行しないなど)
- Step
- アクションまたはシェルコマンドのどちらか。
- Action
- 一連の処理をまとめたライブラリのようなもの。Stepの中で指定して使用することができる。
- Runner
- 実際に処理を実行する環境
ステップの実行方法
- スクリプト等の実行とアクションの実行を行うことができる
- コマンドの実行は
run
、アクションの実行はuses
を使う
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- run: npm install -g bats
- run: bats -v
格納先
- 定義ファイルは`.github/workflows`の配下に置く
- 形式はyaml
基本的な作り方
公式のGitHub Actions 入門に書かれている通り最初にactions/checkout@v2
を使ってリポジトリの内容にアクセスできるようにする
name: learn-github-actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- run: npm install -g bats
- run: bats -v
ユースケース
Docker Imageの使用
GitLab CI/CD から GitHub Actions への移行に記載されているように[[GitLab]]ではimage
で使用するDocker-image指定していたが、GitHubではcontainer
を使う。
# gitlab
my_job:
image: node:10.16-jessie
# GitHub
jobs:
my_job:
container: node:10.16-jessie
以下のようにより細かな設定も可能。詳細はGitHub docsのReferenceを参照
jobs:
my_job:
container:
image: node:10.16-jessie
env:
NODE_ENV: development
ports:
- 80
volumes:
- my_docker_volume:/volume_mount
options: --cpus 1
作業用ディレクトリの変更
-
working-directory
で指定ができる。Job全体と個別のコマンドごとそれぞれにしてができる。 -
GitHub Actions で作業ディレクトリを変更したいにはパスを
./functions
のように相対パスで指定する旨書かれていたが、公式ドキュメントにもその旨の記載はなく、実際に作業した時もその書き方ではエラーになったので、仕様がかわったのかもしれない
全体で指定するとき
jobs:
deploy-staging:
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
ジョブごとに指定するとき
- name: Build
run: npm run build
working-directory: functions
参考資料
異なるリポジトリへのアクセスを行う場合
GitHub Appsを使うことでマシンユーザを使わなくて済む
特定の条件下で動かしたい
Pull Request
opened
だけだと、コミットを追加してプッシュした時に起動しない。
on:
pull_request:
types: [opened, synchronize]
ファイルの差分
paths
を指定すればOK?
on:
push:
branches:
- main
paths:
- "packages/package-a/**"
マージされたときだけ
以下のようにすれば特定のブランチにマージしたときだけトリガーが起動する。
on:
pull_request:
branches:
- master
types: [closed]
jobs:
tag:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
参考資料
actions/checkoutでエラー
以下のエラーが出る。
Run actions/checkout@v2
Syncing repository: beerbash/database
Getting Git version info
Deleting the contents of '/home/runner/work/database/database'
Initializing the repository
Disabling automatic garbage collection
Setting up auth
Fetching the repository
/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +1dfae89fe75143cff2125ccec19b88159176bb16:refs/remotes/origin/main
remote: Repository not found.
Error: fatal: repository 'https://github.com/xxxxxxxxxx' not found
The process '/usr/bin/git' failed with exit code 128
Waiting 19 seconds before trying again
/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +1dfae89fe75143cff2125ccec19b88159176bb16:refs/remotes/origin/main
remote: Repository not found.
Error: fatal: repository 'https://github.com/xxxxxxxxxx' not found
The process '/usr/bin/git' failed with exit code 128
Waiting 15 seconds before trying again
/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +1dfae89fe75143cff2125ccec19b88159176bb16:refs/remotes/origin/main
remote: Repository not found.
Error: fatal: repository 'https://github.com/xxxxxxxxxx' not found
Error: The process '/usr/bin/git' failed with exit code 128