pavlog

ウェブエンジニアがあれやこれやを書きます

【継続的】GitHub Actions CI/CDを試してみた【デリバリー】

ci cd running

先日GitHubが CI/CDサービスを標準サポートする ことが発表されました。

github.blog

現在、既にベータとして稼働中で触ることができます。 普段業務では主にCircle CIを触っています。またプライベートでは AzurePipelines、Jenkins CI、Travis CIのいずれも触った経験があります。

業務で使うのであれば、個人的には経験が深いCircleCIが好きですが、個人での利用においては無料利用の幅が広いAzure Pipelinesを推したいです。

【開発環境】dotfilesでも継続的にインテグレーションする - pavlog

そんな複数サービスが存在するCI/CDサービスへGitHubのActionsが登場したのは嬉しいことです。

CI/CDとは

CI/CDは「Continuous Integration/Continuous Delivery」の略称です。日本語へ言い換えると、継続的インテグレーションと継続的デリバリーです。

ソフトウェアの変更を常にテストし、プロダクション環境へリリース可能な状態にする手法のことを言います。 これによって、昔と比べバグに素早く気がつくことができたり、修正や更新のリリースを自動化できたりすることが可能になっています。

GitHub Actionsについて

今回、CI/CDが追加されたのはGitHub Actionsの一機能としてです。 このGitHub Actionsは、例えばメンバーのアサインやPR(プルリクエスト)へのコメントをしたり、Lintなども行うことが可能です。

新規にここに追加されたCI/CDサービスについて、今回は簡単な例を実装したものを載せつつレビューしてみたいと思います。

尚GitHub Actions CI/CDの後ろ側にはAzure Pipelinesがいそうです。

The GitHub Actions virtual environments are hosted on virtual machines in Microsoft Azure with the GitHub Actions runner installed. The GitHub Actions runner is a fork of the Azure Pipelines Agent.

Virtual environments for GitHub Actions - GitHub Help

GitHub Actions CI/CDを触ってみる

GitHubにアクセスして、CI/CDを設定したいレポジトリへアクセスしましょう。

The world’s leading software development platform · GitHub

画像に表示したActionsタブより、CI/CDを設定するためのページへ移動することができます。 初回表示の際は、このレポジトリで有効にするかどうかを表示していますので、有効にして進みます。

enable repository

before actions

実際の設定ページは以下となります。

1にはSimple Workflowとあるように、空っぽのワークフローが用意されています。

select workflow

Simple Workflow

実際に押すとGitHub Actionsの時と同じように編集画面が表示されます。 既存で存在するコードは以下の通りです。ここをベースに設定することになります。

実際にどのようなものを記述するのかは、コメントで注記しておきました。

name: CI                                    # CI/CD名
on: [push]                                  # 実行のトリガー
jobs:                                       # ジョブリスト
  build:                                    # ジョブ(名)定義
    runs-on: ubuntu-latest                  # 実行するマシン
    steps:                                  # 実行するステップリスト
    - uses: actions/checkout@master         # 利用するアクション
    - name: Run a one-line script           # 実行するステップの名前
      run: echo Hello, world!               # 実行処理
    - name: Run a multi-line script
      run: |
        echo Add other actions to build,
        echo test, and deploy your project.

popular workflowにいるnode.jsのコードは以下の通りです。

name: Node CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Use Node.js 10.x
      uses: actions/setup-node@v1
      with:
        version: 10.x
    - name: npm install, build, and test
      run: |
        npm install
        npm run build --if-present
        npm test

こちらも同様で、steps内に存在する with が初出です。node.js のバージョンを指定することができます。

GitHub Actions CI/CDの特徴

実際にコードを書いてCI/CDが走るまでを作ってみました。 (プロジェクト本体が、 yarn を使っているので冗長になっています。)

コードを見るとよくわかりますが、 matrix.* という記述が散見されます。 これは、 strategy.matrix 以下に入っている値を全て突っ込んで実行してくれます。

一番大きな特徴はマシンの実行環境の幅が広いことと複数バージョンでの実行が簡単に行えることだと思いました。 Circle CIだと記述次第では複数OS + 複数バージョンでのテストも可能ですが、記述量が膨大になってしまいます。

以下で実行されるCIのジョブは6つです。

name: Linter
on: [push]
jobs:
  build:
    name: Lint on node ${{ matrix.node_version }} and ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        node_version: [11, 12]
        os: [ubuntu-16.04, ubuntu-18.04, ubuntu-latest]
    steps:
    - uses: actions/checkout@master
    - name: Use Node.js ${{ matrix.node_version }}
      uses: actions/setup-node@v1
      with:
        version: ${{ matrix.node_version }}
    - name: Setup yarn.
      run: |
        curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.17.3
    - name: yarn install
      run: |
        yarn install
    - name: run static lint
      run: |
        yarn lint

GitHub CI/CD by paveg · Pull Request #1 · paveg/pf · GitHub

コードには書いていませんがMacOSとWindowsOSも利用可能です。

Add a few lines to the Actions YAML file, and let GitHub take care of the rest.

MatrixBuidについて は該当の部分に英語で書かれています。 簡単に記述できるのは最高ですね。

また、環境変数なども設定可能でRepositoryの設定(secrets)ページから個別に設定することが可能です。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: actions/hello-world@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          MY_VAR1: a_variable

終わりに

詳しい説明はこちらに書いてありますので、興味がある方はぜひ見てください。

Workflow syntax for GitHub Actions - GitHub Help

これによってより柔軟にCI/CDサービスが選べるようになります。 また今までセルフホストランナーとしての利用ができるCIサービスはエンタープライズプランにしかないはずで、それができるようになるのがとても魅力的だなと感じました。

今回は導入として記事を書いたので、詳細は省きます(気が向いたら書きます)。

GitHub Japanのツイートでも詳細について書かれていますので興味があれば覗いてみてください!