qiita に記事があまりなかったので掲載しました。
github action の概念は知っているものの、コードかけない、めんどくさい、怖いと言う方が中にはいらっしゃるのではと思います。ここではそんな人達向けに記事を書きました。あくまできっかけづくりです。
サンプルコードがあった方がわかりやすいと思うので、ここではサンプルコードと合わせて解説します。
相当手抜きで解説しますが、ご了承願います。
Github Actionとは
一応一言で言うと github が提供する CICD のサービスです。
制約について公式ドキュメントだったり、色々な人の記事を読んでいただければと思います。
格納先
基本的に GitHub Actions は全て .github/workflow の配下におきます。yml 形式です。
つまり、my_repostiory というレポジトリがあったら、my_repository/.github/workflow/<some_work>.yml
に格納します。
コード
サンプルコード
サンプルがあるとわかりやすいので、それをベースに解説します。
(自分にとっての基礎を鍛えるためのいいサンプルかと思います。)
以下 Pull Request ごとにテストが走るサンプルコードです。
name: Pull_Request
on:
pull_request:
branches:
- master
jobs:
test_job:
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
steps:
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: '3.8.x'
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.REGION }}
- name: Get Actions
uses: actions/checkout@v2
with:
repository: username/repo
token: ${{ secrets.TOKEN }}
ref: master
- name: Run Test
run: pytest
- name: Get Actions From Another Repository
uses: actions/checkout@v2
with:
repository: username/repo
token: ${{ secrets.TOKEN }}
path: another_repo
ref: master
- name: Run Test 2 of another repository
run: |
cd another_repo
pytest
deploy:
needs: [test_job]
runs-on: ubuntu-latest
steps:
- name: Get Actions
uses: actions/checkout@v2
with:
repository: username/repo
token: ${{ secrets.TOKEN }}
ref: master
- name: Get Actions
run: |
cd deploy_items
bash deploy.sh
解説
全体の流れ
上記が何をしているかをざっくり説明すると:
-
test_job
とdeploy
という2つのジョブがある -
test_job
ジョブ では複数のタスクを実行している -
deploy
ジョブ ではデプロイを実行している
各要素の説明
言葉で説明すると:
on
:どのタイミングで実行するかを定義。今回の場合はPR の時であり、その中でも master ブランチのPRの時である。
jobs
: 環境をまっさらにした時の試験単位。今回の場合は build_job
と deploy
のジョブを実行する時に何もない環境からスタートする。
runs-on
: どのような環境でテストするかを定義。windows, Mac-OS も可能。リンク
env
: 環境変数の格納場所。ジョブ実行時に各ステップで共有したい場合に使用する。
steps
: ジョブ内でタスクを実行する単位。レポジトリクローンしたら、ジョブが終了するまで残る。
name
: ステップの名前。github actions で実行している際に表示する。なくても動作可能。
uses
: 他actions の参照。従来、run 等でいろいろコマンド打ったりしないといけないがそれらの作業を回避することができる。
run
: コマンドベースで実行する箇所。run と uses は併用不可能。
needs
: 他のジョブに依存する時に使用可能。
以上で大体のことはわかるのではと思います。残りは公式ドキュメント等読んでいただけると幸いです。
actions について
ちなみに uses で定義している action にて説明すると:
actions/setup-python@v1
: python 環境設定
actions/checkout@v2
: レポジトリをpull する action. レポジトリを指定していなかったら、作業レポジトリをクローンする。 他のブランチやレポジトリをpull することも可能。public であれば、key はいらない。
aws-actions/configure-aws-credentials@v1
: aws にアクセスするための設定。
今回代表的な物を用意したが、他にもいろいろ便利なアクションがあるので、ぜひ他のアクションもみてみてください。
その他, tips
- github secrets は 隠れ変数のことで、レポジトリの settings にて設定可能。echo したら **** と表示。
- steps の結果を参照する際に
id
を使って参照することも可能 - run の中で、環境変数を
echo "<SOME_ENV>=<VALUE>" >> GITHUB_ENV
(前まではecho ::set-env name=<SOME_ENV>::<VALUE>
) と設定することで他のステップで利用することも可能 (${{ env.<SOME_ENV> }}
) - 環境変数に改行を含む文字をいれると
\n
が認識できない場合があるので、その場合は以下の処理を実施してみてください。
text="${text//'%'/'%25'}"
text="${text//$'\n'/'%0A'}"
text="${text//$'\r'/'%0D'}"
解説は以上!
以下、おまけのサンプルコードです。
サンプルコード
サンプル1 Pull Request マージ時にテストを実行
# PR 情報利用するなら・・・
on:
pull_request:
branches:
- master
types: [closed]
jobs:
test_job:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
...
- name: Extract Pull Request Info
id: extract_pull_request_info
run: |
# Get Info
echo pull id is ${{ github.event.pull_request.number }}
echo "PR_NUM=${{ github.event.pull_request.number }}" >> GITHUB_ENV
echo pull request is ${{ github.event.pull_request.title }}
# そのまま使うなら、
on:
push:
branches:
- master
サンプル2 マニュアルでテストしたいとき
name: Manual Release Workflow
on:
workflow_dispatch:
inputs:
name:
description: '名前を入力してください。'
default: 'Watanabe'
required: true
age:
description: '年齢を入力してください'
default: '12'
....
- name: Get Value
run: |
echo ${{ github.event.inputs.name }}
echo ${{ github.event.inputs.age }}
サンプル3 Pull Request をマージしたときに Release を作成
on:
pull_request:
branches:
- master
types: [closed]
jobs:
test_job:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
...
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
with:
tag_name: ${{ github.event.pull_request.title }}
release_name: ${{ github.event.pull_request.title }}
body: |
${{ github.event.pull_request.head.ref }}
draft: false
prerelease: false