Open5

GitHub Actionsについてまとめる

nabetsunabetsu

全体像

GitLab CIなどと同様にイベント駆動型で指定されたイベント(プッシュやコミット、マージリクエスト等)が発生した後に任意の処理を実行することができる。

構成要素としては以下

  • Workflow
    • 一連の処理をまとめた単位で、複数のJobで構成される
    • この後触れるが、Workflowの実体はリポジトリに格納するワークフローファイル
  • Event
  • Job
    • ジョブ単位で同じランナーで処理が実行される。デフォルトでは各ジョブは平行に実行されるが、順番順を指定することもできる。(例えば、ビルドとテストを順番に実行させ、ビルドが失敗した場合にはテストは実行しないなど)
  • Step
    • アクションまたはシェルコマンドのどちらか。
  • Action
    • 一連の処理をまとめたライブラリのようなもの。Stepの中で指定して使用することができる。
  • Runner
    • 実際に処理を実行する環境


Understanding GitHub Actions - GitHub Docs

ステップの実行方法

  • スクリプト等の実行とアクションの実行を行うことができる
  • コマンドの実行は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

参考資料

nabetsunabetsu

特定の条件下で動かしたい

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

参考資料

nabetsunabetsu

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