【CI/CD】GitHub Actionsに入門する

初めまして、Actions

いま業務で触りはじめたシステムが、どうもCI/CDにGitHub Actionsを使っていそう。ということでActionsに入門することとなりました。この記事では「GitHub Actionsについて」「Actionsに関する基本的な知識」をまとめます。

GitHub Actions

GitHub上で、プッシュ・Issue・リリースなどのイベントをトリガーに起動し、対応するアクションを組み合わせてワークフローの自動化が行える仕組みです。 ドキュメントや公開されているActionが多数あるため、これらを活用することで簡単に自動化の実装ができます。 

(GitHub Actionsで日々の小さな作業を自動化する | ペパボテックブログ)

言いかえると、CI(ソフトウェアのビルド・テストを自動化することで品質向上、開発効率化を目指す)とCD(CIに加えてリリース・デプロイも自動化する)のための技術です。同様のツールとしては、Circle CIやJenkinsなどがありますね。

また、前にAppVeyorの記事でも紹介しましたが、GitHub Actionsでは自動テスト実行の環境としてLinux、macOS、Windowsという主要OSすべてに対応している点、最大20ジョブを同時に実行できる=実行時間短縮できる点が特徴です。そして何よりの強みは、ソースコードの管理に普段使っているGitHub内で特に切り替えを意識せず使えることでしょう。

ActionとWorkflow

GitHub Actionsでは、実行する処理とその処理を実行する条件を定義したものを「Workflow(ワークフロー)」と呼ぶ。ワークフローはYAML形式で記述し、リポジトリ内の.github/workflowsディレクトリ内に保存することで実行できるようになる。ワークフロー内では、シェル経由で任意のコマンドを実行できるほか、「Action(アクション)」という、あらかじめ定義済みの処理を呼び出せるようになっている。

GitHubの新機能「GitHub Actions」で試すCI/CD | さくらのナレッジ

ワークフローはYAML形式での表現なので、何かこのための特別なプログラミング言語を学ぶ必要がない、というのはイイですね。この学習コストの低さもメリットになりそう。

ここで少し、開発に利用しているフレームワークgo-macaron/macaronのworkflowをのぞいてみます。

name: Go
on:
  push:
    branches: [master]
  pull_request:
env:
  GOPROXY: "https://proxy.golang.org"

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run golangci-lint
        uses: actions-contrib/golangci-lint@v1

  test:
    name: Test
    strategy:
      matrix:
        go-version: [1.13.x, 1.14.x]
        platform: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.platform }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v1
        with:
          go-version: ${{ matrix.go-version }}
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Run unit tests
        run: go test -v -race -coverprofile=coverage -covermode=atomic ./...
      - name: Upload coverage report to Codecov
        uses: codecov/codecov-action@v1.0.6
        with:
          file: ./coverage
          flags: unittests
      - name: Cache downloaded modules
        uses: actions/cache@v1
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

最初のon.push.branchesで自動テスト実行の対象にするブランチを指定しているようですね。「ここで指定したブランチがプッシュされたら、実行してね」というトリガー指定みたいです。

envでは環境変数を設定していそうです。ちなみに指定されているGOPROXY( “https://proxy.golang.org”)はモジュールのダウンロードを高速にするためのキャッシュプロキシだそう。(参考:Modules | Golang

続くjobsはテスト実行前のあれこれの処理でしょうか。ここでは最新のUbuntu上で構文チェックしているようですね。

そしてtest。test.strategy.matrixで動かすOS, Go言語のバージョンを指定。test.stepsで実際の実行手順を定義、という感じですね。

参考リンク・書籍