Open8

GitHub Actionsで遊ぶ

Kumamoto-HamachiKumamoto-Hamachi

前提となる基礎用語

CI/CD

Continuous Integretion(継続的インテグレーション)

CIをコードの変更を起点にコードの静的解析、ビルド、テストなどを自動実行。

Continuous Deployment(継続的デプロイメント)

コードやビルドされた成果物をプロダクトへ自動反映させること

GitHub Actions

https://github.co.jp/features/actions

その他参考

https://knowledge.sakura.ad.jp/23478/

https://dev.classmethod.jp/articles/github-actions-semantic-release-sample/

Kumamoto-HamachiKumamoto-Hamachi

GitHub Actionsに関わる諸概念

ワークフロー

自動化用の一連の処理、またその定義

イベント

ワークフロー実行のトリガーとなるアクティビティのこと。
リポジトリで発生する操作イベント(Webhook)をトリガーにする。(手動実行も可能)
onシンタックスを用いてYAMLに定義していく。
より詳細は下記。
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows

TODO:ペイロード、アクティビティタイプ

ワークフローの主要構成コンポーネント

- イベント(JOBのトリガー)定義
- JOB定義
      - JOB名
      - ランナー 
      - 各ステップの定義
- JOB定義2 
     - JOB名
      - ランナー
      - 各ステップの定義

ジョブ(Job)

1つ以上のステップから構成されるタスクの定義。
jobsシンタックス下に定義する。
ジョブはランナーとよばれるアプリケーション内で実行される。
ジョブが分割されるとそれぞれ別のランナーアプリケーションインスタンスで実行されるのでジョブ間のデータ共有の工夫が必要。

ステップ(Step)

ステップはジョブの中で実行されるタスク。
jobs.job_id.steps.シンタックス下に個々のステップを定義。

(1)利用するアクション:usesシンタックス
(2)シングルラインコマンド:runシンタックス
(3)マルチラインコマンド:runシンタックス

のいずれかで定義。

アクション

ステップを構成する最小要素。
jobs.job_id.steps[*].usesシンタックスで各ステップで実行するアクションを指定。
アクションは公式アクションやマーケットプレイスで公開もされているのでチェックしてみよう。
アクションは以下の3つで作ることが出来る。

JavaScriptアクション

JSで記述。(TSでも良いはず)
ランナーで直接実行。起動時間は早い。ランナーOSはLinux, Mac, Windowsなど。

Dockerコンテナアクション

アクションの内容をコンテナとしてパッケージ化。
ランナー上でコンテナを立ち上げて実行。言語制約はない。起動時間は(イメージをPullしてからコンテナを立ち上げるので)時間がかかる。
利用可能なランナーOSはLinuxのみ。

Copositeアクション

複数ステップの処理をバンドルし、1つのアクションとして定義実行。
ランナーOSはLinux, Mac, Windowsなど。

ランナー

ジョブはランナーと呼ばれるアプリケーションにより実行される。
runs-onシンタックスで指定。
ユーザーは実行環境のホスティングモデルを以下の2種類のランナーから選択する。

GitHubホスト型ランナー

GitHubが提供しているジョブ実行環境として、ランナーが既にインストールされた仮想マシン。

セルフホスト型ランナー

独自環境で実行。

Kumamoto-HamachiKumamoto-Hamachi

とりあえず始める

任意の自分のリポジトリで「Actions」を選択

テンプレートを選択 or setup a workflow yourself

Kumamoto-HamachiKumamoto-Hamachi

CIパイプラインを構築してみる

適当なリポジトリを作る

-- greeting.py
def greetings():
    return 'Greeting'

if __name__ == "__main__":
    greetings()

-- greeting_test.py
import unittest
from greeting import greetings

class TestGreeting(unittest.TestCase):

    def test_greeting(self):
        self.assertEqual("Greeting", greetings())


if __name__ == "__main__":
    unittest.main()

ワークフロー作成

ローカルリポジトリの.github/workflows下にpython.ymlファイルを作成。
下記はmainブランチへのpushをトリガーに実行され、リポジトリをチェックアウトし、Python環境のセットアップ及びアプリケーションのテストを行う。

name: Kuma Action Test

on:
    # mainへのpush
    push:
        branches:
            - main
    # 手動実行
    workflow_dispatch:

jobs:
    build:
        runs-on: ubuntu-18.04
        steps:
        # リポジトリをチェックアウト
        - uses: actions/checkout@v2
        # Python環境のセットアップ(architectureはデフォでx64)
        - name: Set up Python
          uses: actions/setup-python@v3
          with:
              python-version: '3.7.10'
        - name: Get Python version
          run: python -V
        - name: Test
          run: python greeting_test.py

ワークフロー実行

Kumamoto-HamachiKumamoto-Hamachi

補足メモ イベント「pull_request」の注意点 TODO

イベントによって複数のアクティビティが存在する。特定のアクティビティのときのみをトリガーにすることも可能。
ペイロードとという情報?github.eventコンテキストを使えばworkflow内で使えるらしい。

アクティビティタイプのopenedとsynchronize、reopened以外はワークフローデフォでは実行されないっぽい。

他のアクティビティタイプを使いたいならtypesで明示必要。