Github ActionsGithub Package Registryが安定リリースとなりましたので、さっそく使ってみたメモです

この記事でやる事

  • GithubにあるリポジトリのdevelopブランチにPushがあった事をトリガに、Github Actionsでdocker buildを実行します
  • docker buildした結果を、Github Package Registryにpushして公開します

リポジトリ

関係ないファイルがリポジトリに混入していて申し訳ないですが、今回使用するのは以下の4ファイルのみとなります

1
2
3
4
5
6
7
.github/
└── workflows
└── gh-registry.yml
└── docker
├── Dockerfile
├── Makefile
└── docker-compose.yml

作成: Dockerfile

Nginxのスタートページをちょっとだけ差し替えただけの単純な物です

1
2
3
FROM nginx:latest

RUN echo "Build from Github Actions. Generate: "$(date "+%Y/%m/%d %H:%M:%S") > /usr/share/nginx/html/index.html

作成: docker-compose.yml

docker-composeは無くてもビルド出来ますが、Github Actionsでも使えるのかなと思って作ってみたら使えました

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '2.3'

services:

actions-example:
container_name: actions-example
hostname: actions-example
image: actions-example
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:80

作成: Makefile

こちらもdocker-composeと同様、Github Actionsでmakeが使えるのかなと思って作ってみたら使えました

1
2
build:
docker-compose build actions-example

作成: .github/workflows/gh-registry.yml

cdコマンドのところがやっつけ感がありますが即席なのでヨシとします

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
name: Build Dockerfile and Push Github Package Registry

on:
push:
branches:
- develop

jobs:
build-and-push:

runs-on: ubuntu-18.04
timeout-minutes: 300

steps:
- uses: actions/checkout@v1

- name: Build Image
run: |
cd docker/ && make build && cd ../

いったんコミット

ここまででいったんコミットします

1
2
3
$ git add .
$ git commit -m "initial commit."
$ git push origin develop

コミット後、実際にビルドが動いているか確認します

リポジトリのページに行き、「Actions」タブを選択すると、ビルド実行状況が確認できると思います

Personal Access Tokenを取得する

Github Actionsが使用するTokenを発行します。(右上のメニューから「Setting」→「Developer Setting」→「Personal access tokens」→「Generate new token」)

以下の赤枠のところが今回増えているので、権限をつけてTokenを作成します

access_token

TokenをSecretに保存する

リポジトリのページに行き、「Settings」→「Secrets」と進むと、環境変数が設定出来るので、ここに先ほど取得したTokenを設定します

今回、NameはGH_ACCESS_TOKENとしていますが、任意です

secrets

編集: .github/workflows/gh-registry.yml

ymlファイルに、ビルドしたイメージをPushするActionを追加します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: Build Dockerfile and Push Github Package Registry

on:
push:
branches:
- develop

jobs:
build-and-push:

runs-on: ubuntu-18.04
timeout-minutes: 300

steps:
- uses: actions/checkout@v1

- name: Build Image
run: |
cd docker/ && make build && cd ../

## ここから追加
- name: Push to Github Package Registry
run: |
docker login docker.pkg.github.com -u nobiki -p ${{ secrets.GH_ACCESS_TOKEN }}
docker tag actions-example docker.pkg.github.com/nobiki/actions-test/actions-example:latest
docker push docker.pkg.github.com/nobiki/actions-test/actions-example:latest

docker loginの行で、先ほどのGH_ACCESS_TOKENを使用してログインしている事がわかります
URLは、docker.pkg.github.com/[アカウント名]/[リポジトリ名]/[Image名]:[Tag名]となるようです

コミット

この内容でコミットします

1
2
3
$ git add .
$ git commit -m "add actions - push package registry"
$ git push origin develop

先ほどと同じくリポジトリのページに行き、「Actions」タブを選択すると、ビルド実行状況が確認できると思います
うまくビルドが終わり、Package RegistryにPushが出来ていれば、リポジトリのページで下記のように「1 package」となり、パッケージの情報を見る事が出来るようになっています(クリックでpullコマンドなどがコピペできます)

menu

Package Registryからイメージをとってきてコンテナを作ってみる

作成したイメージをローカルマシンなどで使ってみます

1
2
3
4
5
6
7
// ログイン
$ docker login docker.pkg.github.com -u nobiki
Password:

// pullする
$ docker pull docker.pkg.github.com/nobiki/actions-test/actions-example:latest
Error response from daemon: unauthorized: Your token has not been granted the required scopes to execute this query. The 'name' field requires one of the following scopes: ['read:packages'], but your token has only been granted the: [''] scopes. Please modify your token's scopes at: https://github.com/settings/tokens.

エラーになる。権限が無いらしい

公式によると、ここでログインする際には、先の手順で発行した権限つきのTokenをパスワードとして使用するのが正しいみたいです(さっき作ったGH_ACCESS_TOKENの値をパスワードに入力する) こんな仕様知らなくて30分ぐらいハマった

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ログイン
$ docker login docker.pkg.github.com -u nobiki
Password: (※先に取得したPersonal Access Tokenの値を入力する)

// pullする
$ docker pull docker.pkg.github.com/nobiki/actions-test/actions-example:latest
latest: Pulling from nobiki/actions-test/actions-example
8d691f585fa8: Already exists
fea3111adf4a: Already exists
0f8661492b6d: Already exists
692f0881eac8: Pull complete
Digest: sha256:e6e696ff5bd6e8c57194b098ccca57141b402357f36qd9376961e0b2e4a30ed6
Status: Downloaded newer image for docker.pkg.github.com/nobiki/actions-test/actions-example:latest
docker.pkg.github.com/nobiki/actions-test/actions-example:latest

// 確認
$ docker images | grep actions-example
docker.pkg.github.com/nobiki/actions-test/actions-example latest 0b473e217eb8 12 minutes ago 126MB

pullできましたので、起動してみます

1
$ docker run -d --rm -p 8080:80 docker.pkg.github.com/nobiki/actions-test/actions-example

browser

ビルドした内容のWebサーバが起動すればOKです(JSTになってないけど即席なのでヨシとする)

料金

現時点では、Publicリポジトリに関しては無料のようです。Privateリポジトリに関しては、実行時間と転送量ベースで制限があるようです(いくらか無料枠があります)