yyh-gl's icon

yyh-gl's Tech Blog

技術ネタ中心のブログです。主な扱いはバックエンド技術と設計です。

yyh-gl

3 分で読めます

featured

プライベートアクションとは

GitHub Actions では、開発者がアクション(Lint やテストといったジョブなど)を作って、公開することができます。
この公開されたアクションは、世界中の人が使えるため、もちろん自分のプロジェクトに持ってきて使用できます。
この公開されたアクションのことを パブリックアクション といいます。

パブリックアクションが溢れた世界を想像するだけでワクワクしますね👍
(野良 Docker イメージと同様に、ほいそれとは使えないでしょうが…)


今回、とりあげるのはパブリックアクションの正反対にあるものです。
つまり、公開しない(できない)アクション = プライベートアクション です。

プライベートアクションを使うための準備

ディレクトリ構成は以下のとおりです。

.github
├── actions
│   └── golang-test
│       ├── Dockerfile
│       ├── action.yml
│       └── entrypoint.sh
└── workflows
    └── golang.yml

/actions ディレクトリ配下に golang-test という、Lint とテストを実行するアクションを作ってみます。

/workflow ディレクトリ配下には、golang 用のワークフロー定義ファイルを置いています。

では、次から各ファイルの定義を見ていきます。

プライベートアクションの定義

# /actions/golang-test/action.yml

name: 'Golang Lint and Test Action'
description: 'Lint and Test for Golang'
author: 'yyh-gl'
runs:
  # Docker を使って実行することを宣言
  using: 'docker'
  # 使用する Docker イメージを指定
  image: 'Dockerfile'

アクションの定義は上記のとおりです。
公式ドキュメント を参考にしました。

action.yml 内で使用している Dockerfile は以下のとおりです。

# /actions/golang-test/Dockerfile
FROM golang:1.12.5

LABEL "name"="Golang workflow" \
    "maintainer"="yyh-gl <yhonda.95.gl@gmail.com>" \
    "com.github.actions.icon"="code" \
    "com.github.actions.color"="green-dark" \
    "com.github.actions.name"="golang workflow" \
    "com.github.actions.description"="This is an Action to run go and golangci-lint commands."

ENV LINT_VERSION="v1.18.0"

COPY entrypoint.sh /entrypoint.sh

RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin ${LINT_VERSION} \
  && chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

Dockerfile 内で使用している entorypoint.sh は以下のとおりです。

# /actions/golang-test/entrypoint.sh

#!/bin/bash

APP_DIR="/go/src/github.com/${GITHUB_REPOSITORY}/"

mkdir -p "${APP_DIR}" && cp -r ./ "${APP_DIR}" && cd "${APP_DIR}"

export GO111MODULE=on
go mod tidy
go mod verify

if [[ "$1" == "lint" ]]; then
    echo "############################"
    echo "# Running GolangCI-Lint... #"
    echo "############################"
    golangci-lint --version
    echo
    golangci-lint run --tests --disable-all --enable=goimports --enable=golint --enable=govet --enable=errcheck ./...
fi

Dockerfileentrypoint.shこちら を参考にしました。

ワークフローの定義

# /workflow/golang.yml

# ワークフローの名前
name: Workflow for Golang
# push をトリガーとしてワークフローを実行
on: [push]

# ジョブを定義:ジョブは並列処理される(デフォルト動作)
jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    # job の中にさらに細かい粒度で step が存在:step は job と違い上から順に実行される
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Lint
        uses: ./.github/actions/golang
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Test
        run: go test ./...

/workflows/golang.yml の中身を上記のとおりです。
今回は Lint と go test を並列で実行しています。

重要ポイント:プライベートアクションとパブリックアクションでの設定差異

プライベートアクションを使用するときは チェックアウト が必須です!

公式ドキュメントのサンプル を下記に示します。

name: Greet Everyone
# This workflow is triggered on pushes to the repository.
on: [push]

jobs:
  build:
    # Job name is Greeting
    name: Greeting
    # This job runs on Linux
    runs-on: ubuntu-latest
    steps:
      # This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action
      - name: Hello world
        uses: actions/hello-world-javascript-action@v1
        with:
          who-to-greet: 'Mona the Octocat'
        id: hello
      # This step prints an output (time) from the previous step's action.
      - name: Echo the greeting's time
        run: echo 'The time was ${{ steps.hello.outputs.time }}.'

14行目でパブリックアクションを使用しています。
パブリックアクション使用時は、アクションの本体(コード)がどこからでも取得可能な場所にあるのでチェックアウトが必要ありません。

しかし、プライベートアクションは自分のプロジェクト内にアクションの本体があります。
したがって、チェックアウトして、プロジェクトのコードをアクション実行環境に持ってくる必要があります。

重要ポイント:チェックアウト

ここで、GitHub Actions ではどのようにしてチェックアウトするのか。ですが、
答えは パブリックアクションを使用する です。

GitHub が公開している公式アクションの中に、actions/checkout があります。
これを使用します。

僕のコードでいうと、 /workflow/golang.yml 内の 16 行目で使用しています。


「チェックアウト って何?」という方は、
actions/checkout の README の説明がとても分かりやすいと思います。

This action checks out your repository to $GITHUB_WORKSPACE, so that your workflow can access the contents of your repository.

(あなたのリポジトリ(コード)を $GITHUB_WORKSPACE に持ってきて、ワークフローがそのコードにアクセスできるようにする)

↑ これを実現するためのものです。

プライベートアクションはネット上に公開されていないから、
手元にあるアクション本体(コード)を GtHub Actions の実行環境に持っていった

というだけですね。


ワークフローを実行

後は push するだけです。

実際、push してみると、
下記のとおり、ワークフローが実行されました🎉

ログを見ると、Dockerfile からアクションが組み立てられていることが、なんとなく読み取れると思います。

まとめ

パブリックアクションが実現する CI/CD まわりのエコシステムは、とてもワクワクしますね。
でも、やっぱり公開できないアクションもあると思います。

そういったときにはプライベートアクションを活用していきましょう。


【余談】

ワークフローについてもっと知りたい方は、 ぜひ公式ドキュメント を読んでみてください。


日本語対応しています👍

参考記事

最近の投稿

About

東京で働くソフトウェアエンジニアです。バックエンドがメインですが、フロントエンドやインフラもさわっています。