GitHub Actions@CIツール¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. GitHub Actionsの仕組み¶
アーキテクチャ¶
GitHub Actions Runnerは、GitHubリポジトリの設定ファイルをHTTPSで参照し、定義されたパイプラインを実行する。
GitHub Actions Runner¶
▼ GitHub Actions Runnerとは¶
GitHub Actionsの設定ファイルで定義されたパイプラインを実行する。
▼ Self hosted Runner¶
GitHub Actionsのパイプラインをサーバー (例:オンプレサーバー、AWS EC2など) 上で実行する。
パイプライン構成¶
記入中...
GitHub Apps¶
GitHubとは別の実行環境 (例:AWS Lambda) で稼働し、GitHubのAPIをコールする。
ビルトインの静的解析¶
▼ 脆弱性診断¶
CodeQLを使用して、ソースコードの脆弱性を検証できる。
CodeQL以外の脆弱性診断ツールを使用するよりも、GitHubと連携しやすい。
02. セットアップ¶
インストール¶
repository/
├── .github/
│ └── workflows/
│ └── foo.yml
│
03. name¶
nameとは¶
Workflow名を設定する。
name: foo
push¶
▼ branch¶
プッシュを検知するブランチを設定する。
ワイルドカード (*
) を使用できる。
on:
push:
branches:
- release/**
04. jobs¶
jobsとは¶
Workflowの具体的な処理を設定する。
runs-on¶
GitHub Actionsの実行環境を設定する。
jobs:
foo:
runs-on: ubuntu-latest
▼ インストール済みソフトウェア¶
使用するOSに応じて、いくつかの汎用的なソフトウェアがプリインストールされている。
steps¶
▼ continue-on-error¶
同じsteps
キー内のrun
キーが失敗しても成功扱いにするか否かを設定する。
jobs:
build:
steps:
- continue-on-error: "true"
run: |
exit 1
- if: failure() # 成功扱いのため、このステップには入らない。
run: |
echo failure
- if: success() # 成功扱いのため、このステップに入る。
run: |
echo success
▼ if¶
条件を満たした場合、後続のrun
キーを実行する。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- run: |
# 何らかの処理
- if: failure() # 失敗した場合、このステップに入る。GitHub Actionsの失敗表記は消えない。
run: |
echo failure
- if: success() # 成功扱いのため、このステップに入る。
run: |
echo success
▼ run¶
任意のコマンドを実行する。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Git config
run: |
git config --local user.email "example@gmail.com"
git config --local user.name "github-actions"
git config pull.rebase false
▼ uses¶
使用するActionsを設定する。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
▼ with¶
Actionsに設定できるパラメーターをわたす。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
# これはエラーになってしまう
# php-version: $PHP_VERSION
注意点として、環境変数を渡せない。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
# これはエラーになってしまう
php-version: $PHP_VERSION
05. on¶
workflow_call¶
再利用可能なワークフローを定義する。
# pre-foo-template.ymlファイル
name: pre foo template
on:
workflow_call: {}
jobs:
pre-foo:
runs-on: ubuntu-latest
steps:
- run: |
# 何らかの処理
# post-foo-template.ymlファイル
name: post foo template
on:
workflow_call: {}
jobs:
post-foo:
runs-on: ubuntu-latest
steps:
- run: |
# 何らかの処理
定義したワークフローは他リポジトリからコールできる。
jobs:
# テンプレートワークフローのJobを実行する
calling-pre-foo-template:
# テンプレートワークフローリポジトリの設定ファイルを読み込む
uses: <オーナー>/<GitHubリポジトリ>/.github/workflows/pre-foo-templateyml@main
foo:
runs-on: ubuntu-latest
steps:
- run: |
# 何らかの処理
# テンプレートワークフローのJobを実行する
calling-post-foo-template:
# テンプレートワークフローリポジトリの設定ファイルを読み込む
uses: <オーナー>/<GitHubリポジトリ>/.github/workflows/post-foo-templateyml@main
- https://docs.github.com/ja/actions/using-workflows/reusing-workflows#creating-a-reusable-workflow
- https://zenn.dev/dzeyelid/articles/fc4bd999fbccd8#github-actions-%E3%81%A7%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%82%8B
06. runs¶
composite¶
▼ compositeとは¶
親ファイルのsteps
を別のファイルに切り分け、親ファイルでコールできる。
workflows
ディレクトリ配下に任意のサブディレクトリを用意し、そこにaction
ファイルを配置する。
親ファイルでディレクトリを指定すると、action
ファイルが自動的に読み込まれる。
repository/
├── .github/
│ └── workflows/
│ ├── foo.yml
│ └── composite/
│ ├── bar/
│ │ └── action.yml
│ │
│ ├── baz/
│ │ └── action.yml
│ │
... ...
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Echo
# compositeのディレクトリを指定する。
uses: ./.github/workflows/composite/bar
ファイル名は、『action
』とする必要がある。
Error: Can't find 'action.yml', 'action.yaml' ...
▼ Secretsは使用不可¶
compositeでは、Secretsを使用できない。
そのため、input
キーのパラメーターとして渡す必要がある。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Echo
uses: ./.github/workflows/composite/echo
# パラメーターで渡す。
with:
foo: ${{ secrets.FOO }}
inputs:
foo:
description: foo
required: "true"
runs:
using: "composite"
steps:
- name: Echo
shell: bash
run: |
echo ${{ inputs.foo }}
▼ Checkoutは使用不可¶
チェックアウト処理は定義できない。
runs:
using: "composite"
steps:
- name: Checkout # これはエラーになってしまう。
uses: actions/checkout@v2
- name: Echo
shell: bash # シェルの種類を設定する。
run: |
echo foo
▼ シェルの種類を要指定¶
もしsteps
を定義する場合は、shell
キーでシェルの種類を指定する必要がある。
runs:
using: "composite"
steps:
- name: Echo
shell: bash # シェルの種類を設定する。
run: |
echo foo
07. 環境変数¶
Workflowレベル¶
▼ Workflowレベルとは¶
定義されたworkflow
(yaml
ファイル) 内のみで参照できる。
▼ env¶
環境変数を定義する。
Secretの値を設定できない。
env:
FOO: foo
BAR: bar
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
run: |
echo ${{ env.FOO }}
Jobsレベル¶
▼ Jobsレベルとは¶
定義されたjobs
キー内のみで参照できる。
▼ env¶
jobs:
foo:
runs-on: ubuntu-latest
env:
FOO: foo
steps:
- name: Echo
run: |
echo ${{ env.FOO }}
▼ 環境ファイル¶
環境ファイル (GITHUB_ENV
) に値を入力することにより、job
内の環境変数として使用できるようになる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Export envs
run: |
echo "FOO=foo" >> $GITHUB_ENV
- name: Echo
run: |
echo ${FOO}
注意点として、マスキングされた値は入力できない。
Stepレベル¶
▼ Stepレベルとは¶
定義されたstep
キー内のみで参照できる。
▼ env¶
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
env:
FOO: foo
run: |
echo ${{ env.FOO }}
07-02. Secret変数¶
Secret変数とは¶
環境変数と同様にしてGitHub Actions内で使用できる。
また、add-mask
コマンドと同様のマスキングが最初から実行されている。
マスキング¶
▼ スコープ¶
以降の全ての処理でマスキングが実行される。
もちろん、inputs
キーで渡した値にもマスキングが維持される。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
uses: ./.github/workflows/composite/foo
with:
bar: ${{ secrets.FOO }}
inputs:
bar:
required: "true"
runs:
using: "composite"
steps:
- name: Echo
shell: bash
run: |
FOO=${{ inputs.bar }}
これに関しては以前は非対応であったため、add-mask
コマンドを使用した方法がネット上で見つかることに注意する。
▼ 注意点¶
注意点として、マスキングされる値と同じ文字列が使用されると、これもマスキングされる。
そのため、例えばinput
キーでマスキングされた値と同じ文字列を使用してしまうと、yaml
ファイルの構文解析でエラーになってしまう。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
uses: ./.github/workflows/composite/foo
with:
foo: ${{ secrets.FOO }}
inputs:
foo: # マスキングされ、.yamlファイルの構文解析でエラーになってしまう
required: "true"
runs:
using: "composite"
steps:
- name: Echo
shell: bash
run: |
FOO=${{ inputs.foo }}
変数のスコープレベル¶
▼ Projectレベル (Repository Secrets)¶
リポジトリの設定のSecrets項目に変数名と値を登録する。
プロジェクト内、すなわちリポジトリ内で参照できる。
出力された変数の値は、以降の処理でマスキングされる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
run: |
echo ${{ secrets.FOO }}
▼ Actionレベル (Environment Secrets)¶
リポジトリの設定のEnvironment項目に変数名と値を登録する。
リポジトリ内のGitHub Actionsのみで参照できる。
また、シェルスクリプト内で環境変数を出力するためにも必要である。
出力された変数の値は、以降の処理でマスキングされる。
Projectレベルとは異なり、env
キーに明示的に環境変数を渡す必要がある。
jobs:
foo:
runs-on: ubuntu-latest
env:
FOO: foo
steps:
- name: Echo
run: |
echo ${{ secrets.FOO }}
source ./bar.sh
▼ Stepレベル¶
jobs.foo.steps.env
キーに変数名と値を登録する。
ステップ内のみで参照できる。
また、シェルスクリプト内で環境変数を出力するためにも必要である。
出力された変数の値は、以降の処理でマスキングされる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Echo
env:
FOO: foo
run: |
echo ${{ secrets.FOO }}
source ./bar.sh
08. Actions¶
actionsパッケージ¶
▼ checkout¶
プロジェクトをクローンする。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
▼ upload-artifact、download-artifact¶
異なるjobs
の間でファイルを共有する。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: artifact
path: ./foo
bar:
needs: bar
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Download artifact
uses: actions/download-artifact@v2
with:
name: artifact # 展開するアーティファクトを設定する。
09. Workflowコマンド¶
add-mask¶
▼ add-maskとは¶
変数の値をマスキングする。
以降、ログに出力される場合は、『***
』のようにアスタリスクで表示される。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Echo
run: |
FOO=foo
echo "::add-mask::${FOO}"
echo ${FOO}
set-output¶
▼ set-outputとは¶
GitHub Actionsのユーザー定義のパラメーターを入力する。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
echo "::set-output name=FOO::foo"
▼ 同じstep内では使用不可¶
同じstep
内で、パラメーターの入力と出力を行っても、値は空になる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
echo "::set-output name=FOO::foo"
echo ${{ steps.foo_id.outputs.FOO }}
▼ 異なるstep間での共有¶
入力したパラメーターは、異なるstep
の間で出力できる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
echo "::set-output name=FOO::foo"
- name: Echo
run: |
echo "${{ steps.foo_id.outputs.FOO }}"
Secretsやadd-mask
コマンドでマスキングされた値も共有でき、またマスキングを維持できる。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
FOO=foo
echo "::add-mask::${FOO}"
echo "::set-output name=FOO::${FOO}"
- name: Echo
# 共有可能。マスキング維持可能。
run: |
echo "${{ steps.foo_id.outputs.FOO }}"
▼ 異なるjob間での共有¶
入力したパラメーターは、異なるjob
の間で出力できる。
先に実行されるjob
キーのoutput
キーに入力する必要がある。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
echo "::set-output name=FOO::foo"
# 後続のjobに渡すパラメーター
output:
FOO: ${{ steps.foo_id.outputs.FOO }}
bar:
runs-on: ubuntu-latest
needs: foo
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Echo
run: |
echo "${{ needs.foo.outputs.FOO }}"
ただし異なるjob
では、Secretsやadd-mask
コマンドでマスキングされた値は共有できず、空になってしまう。
jobs:
foo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set output
id: foo_id
run: |
FOO=foo
echo "::add-mask::${FOO}"
echo "::set-output name=FOO::${FOO}"
output:
FOO: ${{ steps.foo_id.outputs.FOO }}
bar:
runs-on: ubuntu-latest
needs: foo
steps:
- name: Checkout
uses: actions/checkout@v2
# 空になってしまう。
- name: Echo
run: |
echo "${{ needs.foo.outputs.FOO }}"