GitHub ActionでCI環境やってみる

はじめに

今更ながらGitHub ActionでのCI環境作ってみる。

そもそも一から作ったことがないので、
改めて公式みながらやってみましょう。

初めに行っておくと今回は基本的な動作のみで、CI構築まで至らず。
CI構築は次の機会に。

公式が結構充実していて、クイックスタートやガイドを読み進めると基本的なパターンはわかりそうです。
ここで書いた内容もほぼ公式の抜粋となっております。

準備

  1. リポジトリを用意する。(新規でも既存のでもOK)

  2. ブランチ作っておきます。作業は作ったブランチで行います。
    github-action-demoとでもしておきます。
    ※後の手順でプルリクを作り、そこでGitHub Actionが動作するのを見たいので以降はブランチで作業します。

ワークフローの作成

クイックスタートをベースにしています。
クイックスタートではGitHub上で直接ファイルやディレクトリを作成していますが、
ここではローカルでブランチを切ってファイルを作成していくイメージとしています。
VSCodeでの入力補完など効かせたかったので上記としています。

GitHub Actions のクイックスタート - GitHub Docs

  1. リポジトリ直下にgithub/workflows ディレクトリを作成します。
  2. github-actions-demo.ymlというファイル名のYAMLファイルを作成します。
  3. YAMLの中身はまるっとコピペ
  4. YAMLファイルを保存して、コミット&プッシュします。
  5. プルリク作成します。
  6. Actionが動作します。

YAMLファイル

name: GitHub Actions Demo
on: [push]
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v2
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."

クイックスタートのアクションはほぼechoでテキストを出力しているだけですが、
githubコンテキスト情報を使っていたり、
usesでソースをチェックアウトしてたり参考になります。

GitHub Actionsのワークフロー構文

name

ワークフローの名前。 GitHubでは、リポジトリのアクションページにワークフローの名前が表示されます。
nameを省略すると、GitHubリポジトリのルートに対するワークフローファイルの相対パスをその値に設定します。

on

必須。
ワークフローをトリガーするGitHubイベントの名前。
指定できるのは、1つのイベントstring、複数イベントのarray、イベントtypesのarrayです。
あるいは、ワークフローをスケジュールする、またはワークフロー実行を特定のファイルやタグ、ブランチ変更に限定するイベント設定mapも指定できます。
使用可能なイベントの一覧は、「ワークフローをトリガーするイベント」を参照

permissions

# 権限の指定(未指定の場合はnone)
permissions:
  actions: read|write|none
  checks: read|write|none
  contents: read|write|none
  deployments: read|write|none
  issues: read|write|none
  packages: read|write|none
  pull-requests: read|write|none
  repository-projects: read|write|none
  security-events: read|write|none
  statuses: read|write|none
# 読み込み権限
permissions: read-all
# 書き込み権限
permissions: write-all

env

環境変数のmap。
ワークフロー中のすべてのジョブのステップから利用できる。

env:
  SERVER: production

default

デフォルト設定のmap。
ワークフロー中のすべてのジョブに適用されます。

defaults:
  run:
    shell: bash
    working-directory: scripts

concurrency:

まだベータ版のようですが、並行処理の設定が可能
デフォルトでは、ジョブは並行して実行されます。

jobs

ワークフローの実行処理
1つ以上のジョブが必要
デフォルトでは並行して実行されるが、順序を制御したい場合はneedsキーワードを使用する。

jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job

needs

jobs:
  job1:
  # job1の終了後に実行
  job2:
    needs: job1
  # job1とjobb2の終了後に実行
  job3:
    needs: [job1, job2]

※途中のジョブが失敗した場合、そのジョブを必要としている他のジョブはすべてスキップされます。

runs-on

ジョブが実行されるマシンの種類
GitHubホストランナーあるいはセルフホストランナー

runs-on: ubuntu-latest

environment

GitHub上で設定できるenvironmentの指定
environmentの名前を指定することでenvironment内の環境変数をすべて設定可能

jobs:
  stale:
    runs-on: ubuntu-latest

    permissions:
      issues: write
      pull-requests: write

    environment: staging_environment

    steps:
      - uses: actions/stale@v3

steps

ジョブの中の1実行単位

name

GitHubで表示されるステップの名前。

uses

実行されるアクションを選択します。

run

OSのシェルを使用してコマンドラインプログラムを実行します。

matrix

単一のジョブ設定を元に複数のジョブを実行する。
複数バージョンの言語や複数のOSなど

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    os: [ubuntu-18.04, ubuntu-20.04]
    node: [10, 12, 14]
steps:
  - uses: actions/setup-node@v2
    with:
      node-version: ${{ matrix.node }}

container

ジョブ実行時のコンテナ設定

各ワークフロー構文の詳細

詳細は下記参照ですが、割と使いそうなものだけピックアップ
GitHub Actionsのワークフロー構文 - GitHub Docs

onの詳細

単一のイベントの例

# リポジトリ内の任意のブランチにコードがプッシュされたときにトリガーされる
on: push

複数イベントの例

# プッシュもしくはPull Requestイベントでワークフローをトリガーする
on: [push, pull_request]

複数イベントで異なるアクティビティを指定する例

on:
  # プッシュもしくはPull Requestでワークフローをトリガーする
  # ただしメインブランチの場合のみ
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  # page_buildとリリース作成イベントでもトリガーする
  page_build:
  release:
    types: # この設定は上記のpage_buildイベントには影響しない
      - created

詳細
ワークフローをトリガーするイベント - GitHub Docs

ホストランナー

GitHubホストランナー

オペレーティングシステム、プリインストールされたパッケージとツール、セルフホストランナーアプリケーションの自動アップデートを受信します。
GitHubによって管理及びメンテナンスされます。
ジョブの実行のたびにクリーンなインスタンスを提供します。
GitHubプランの無料の分を使います。無料の分を超えると、分単位のレートが適用されます。

セルフホストランナー

セルフホストランナーアプリケーションのみ、自動アップデートを受信します。
オペレーティングシステムとその他のソフトウェアのアップデートはあなたがしなければなりません。
すでに支払いをしているクラウドサービスあるいはローカルマシンを利用できます。
利用するハードウェア、オペレーティングシステム、ソフトウェア、セキュリティ上の要求に合わせてカスタマイズできます。
ジョブの実行のたびにクリーンなインスタンスを保持する必要がありません。
GitHub Actionsと合わせて無料で利用できますが、ランナーマシンのメンテナンスコストはあなたが受け持ちます。

さいごに

ベース部分はなんとなく理解したので、
引き続きCIの導入と個人的にやりたいプルリクの自動作成を導入します。

色々ためしたリポジトリ GitHub - KaT0819/github-action-test