/ GitHubActionsを試してみる

Created 20 Dec 2018

以前、GitHub Actionsが発表された際にBetaユーザーの登録をしていたら、下記案内メールがGitHubより送られてきた。

パブリックリポジトリでも、リポジトリオーナーからのpushで実行されるeventがサポートされたらしい。

CIとしてはCircleCIを使ったことがあり、今後GitHubActionsを使うことで何か良いことがあるのであれば乗り換えも検討したいので少し検証してみることに。

※ちなみにBeta登録は下記リンクから登録可能。
https://github.com/features/actions/

まずはじめに

どこから実行するのかな〜と思ってたら、さりげなく「Actions」タブが表示されるようになっていた。

ポイントとしては、workflowとactionというのを覚える必要がありそう。
workflowが大きな枠組みで、workflowの中に実際に実行するactionをいれて組み合わせていく。

ここにアクセスすると、過去に試しに置いておいたファイルがworkflowとして認識されていた。
また create a new workflow というボタンからGUIベースでもworkflowを作成することができるようだった。

ファイルは .github/main.workflow というのが最初に呼ばれる様子。
とりあえず何かしら動かそうと思い探してみると、どうやらGitHub公式のDockerレジストリが下記にある様子。

https://github.com/actions

上記にあるリポジトリを探しつつ、awsを使ってみることに。
下記のように記述する。

workflow "Test workflow" {
  on = "push"
  resolves = "HelloWorld"
}

action "HelloWorld" {
  uses = "actions/aws/cli@8d31870"
  runs = [ "printf", "HelloWorld" ]
}

workflowを定義して、そこにactionを追加していく。
GitHubへpushすると下記のように実行結果が表示された。

Logをクリックすることで、実行結果も確認できる。

### STARTED HelloWorld 11:35:59Z

Already have image (with digest): gcr.io/cloud-builders/docker
Already have image (with digest): gcr.io/cloud-builders/curl
+ tar xvz --strip=1 -C /872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4
+ curl --fail --silent --show-error --location https://api.github.com/repos/actions/aws/tarball/8d31870
9e9ed2c1e7d077597d180faee048f49d155ff9ba5d3d9bf85e586b3d13b039fd: Pulling from gct-12-63tb1hzc59j0vbhdiht38ny/54f790c4b125caf8872e10a425fb62d0e5966dbf8e53c288779c5083badd82c5/1821030e0e15cc096c6c3a13c936baad1b8a4a98f0cbaf2b25cd4642203093fd
54f7e8ac135a: Already exists
d6341e30912f: Already exists
087a57faf949: Already exists
5d71636fb824: Already exists
0c1db9598990: Already exists
bfb904e99f24: Already exists
78a3d3a96a32: Already exists
885a0ed92c89: Already exists
dd7cc9ace242: Already exists
f06b41a76f64: Pulling fs layer
f3093f57f8da: Pulling fs layer
ae9951a33124: Pulling fs layer
ae9951a33124: Verifying Checksum
ae9951a33124: Download complete
f06b41a76f64: Verifying Checksum
f06b41a76f64: Download complete
f06b41a76f64: Pull complete
f3093f57f8da: Verifying Checksum
f3093f57f8da: Download complete
actions-aws-8d31870/.dockerfile_lint/
actions-aws-8d31870/.dockerfile_lint/default_rules.yaml
actions-aws-8d31870/.dockerfile_lint/github_actions.yaml
actions-aws-8d31870/.dockerignore
actions-aws-8d31870/.github/
actions-aws-8d31870/.github/main.workflow
actions-aws-8d31870/LICENSE
actions-aws-8d31870/Makefile
actions-aws-8d31870/README.md
actions-aws-8d31870/cli/
actions-aws-8d31870/cli/Brewfile
actions-aws-8d31870/cli/Dockerfile
actions-aws-8d31870/cli/LICENSE
actions-aws-8d31870/cli/Makefile
actions-aws-8d31870/cli/README.md
actions-aws-8d31870/cli/THIRD_PARTY_NOTICE.md
actions-aws-8d31870/cli/entrypoint.sh
actions-aws-8d31870/cli/test/
actions-aws-8d31870/cli/test/bin/
actions-aws-8d31870/cli/test/bin/aws
actions-aws-8d31870/cli/test/entrypoint.bats
actions-aws-8d31870/docker.mk
actions-aws-8d31870/help.mk
actions-aws-8d31870/kubectl/
actions-aws-8d31870/kubectl/Brewfile
actions-aws-8d31870/kubectl/Dockerfile
actions-aws-8d31870/kubectl/LICENSE
actions-aws-8d31870/kubectl/Makefile
actions-aws-8d31870/kubectl/README.md
actions-aws-8d31870/kubectl/THIRD_PARTY_NOTICE.md
actions-aws-8d31870/kubectl/entrypoint.sh
actions-aws-8d31870/kubectl/test/
actions-aws-8d31870/kubectl/test/bin/
actions-aws-8d31870/kubectl/test/bin/kubectl
actions-aws-8d31870/kubectl/test/entrypoint.bats
actions-aws-8d31870/shell.mk
f3093f57f8da: Pull complete
ae9951a33124: Pull complete
Digest: sha256:f6356c90746c2bccc615925a87abece3b70733240bf4e6814d792ed19fb7ee34
Status: Downloaded newer image for gcr.io/gct-12-63tb1hzc59j0vbhdiht38ny/54f790c4b125caf8872e10a425fb62d0e5966dbf8e53c288779c5083badd82c5/1821030e0e15cc096c6c3a13c936baad1b8a4a98f0cbaf2b25cd4642203093fd:9e9ed2c1e7d077597d180faee048f49d155ff9ba5d3d9bf85e586b3d13b039fd
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon  40.96kB
Step 1/16 : FROM python:3-stretch
3-stretch: Pulling from library/python
Digest: sha256:68c7a46ca871f8aa522eb73b757dab3307908c3ec52434d96c72cc773f3c1273
Status: Downloaded newer image for python:3-stretch
 ---> 1e80caffd59e
Step 2/16 : LABEL name="aws"
 ---> Using cache
 ---> b3974cccf201
Step 3/16 : LABEL version="1.0.0"
 ---> Using cache
 ---> 2f166463273e
Step 4/16 : LABEL repository="http://github.com/actions/aws"
 ---> Using cache
 ---> 56acb48e0619
Step 5/16 : LABEL homepage="http://github.com/actions/aws"
 ---> Using cache
 ---> a40d740bc66c
Step 6/16 : LABEL maintainer="GitHub Actions <support+actions@github.com>"
 ---> Using cache
 ---> 2f78cb1642f6
Step 7/16 : LABEL com.github.actions.name="GitHub Action for AWS"
 ---> Using cache
 ---> 34dd34b463eb
Step 8/16 : LABEL com.github.actions.description="Wraps the aws CLI to enable common AWS commands."
 ---> Using cache
 ---> e04722d7736a
Step 9/16 : LABEL com.github.actions.icon="box"
 ---> Using cache
 ---> 32f90a7115b6
Step 10/16 : LABEL com.github.actions.color="yellow"
 ---> Using cache
 ---> 543c8419fd7b
Step 11/16 : COPY LICENSE README.md THIRD_PARTY_NOTICE.md /
 ---> Using cache
 ---> 102fe96929b1
Step 12/16 : ENV DOCKERVERSION=18.06.1-ce
 ---> Using cache
 ---> 45c2c6033e4c
Step 13/16 : RUN apt-get update &&   apt-get install -y --no-install-recommends curl groff jq &&   apt-get -y clean && apt-get -y autoclean && apt-get -y autoremove &&   curl -fsSLO https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v0.3.0/heptio-authenticator-aws_0.3.0_linux_amd64 &&   mv heptio-authenticator-aws_0.3.0_linux_amd64 /usr/local/bin/aws-iam-authenticator &&   chmod +x /usr/local/bin/aws-iam-authenticator &&   curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz &&   tar xzvf docker-${DOCKERVERSION}.tgz --strip 1                  -C /usr/local/bin docker/docker &&   rm docker-${DOCKERVERSION}.tgz &&   rm -rf /var/lib/apt/lists/* &&   pip install --upgrade pip &&   pip install setuptools awscli
 ---> Using cache
 ---> e7bb7ed8e13e
Step 14/16 : COPY "entrypoint.sh" "/entrypoint.sh"
 ---> Using cache
 ---> 098a1518572e
Step 15/16 : ENTRYPOINT ["/entrypoint.sh"]
 ---> Using cache
 ---> 1cb0a59c87a2
Step 16/16 : CMD ["help"]
 ---> Using cache
 ---> 5f0b5e30424c
Successfully built 5f0b5e30424c
Successfully tagged gcr.io/gct-12-63tb1hzc59j0vbhdiht38ny/54f790c4b125caf8872e10a425fb62d0e5966dbf8e53c288779c5083badd82c5/1821030e0e15cc096c6c3a13c936baad1b8a4a98f0cbaf2b25cd4642203093fd:9e9ed2c1e7d077597d180faee048f49d155ff9ba5d3d9bf85e586b3d13b039fd
Pulling image: gcr.io/github-actions-images/action-runner:latest
latest: Pulling from github-actions-images/action-runner
4fe2ade4980c: Already exists
93db4b6fb596: Pulling fs layer
f6be8ac3583b: Pulling fs layer
5c1f3ceaa6a7: Pulling fs layer
93db4b6fb596: Verifying Checksum
93db4b6fb596: Download complete
f6be8ac3583b: Verifying Checksum
f6be8ac3583b: Download complete
5c1f3ceaa6a7: Verifying Checksum
5c1f3ceaa6a7: Download complete
93db4b6fb596: Pull complete
f6be8ac3583b: Pull complete
5c1f3ceaa6a7: Pull complete
Digest: sha256:7a5b2b2705b67d203a4c74eee8277f1bbebca90d01bb9b99298afa28488d7dc1
Status: Downloaded newer image for gcr.io/github-actions-images/action-runner:latest
HelloWorld

### COMPLETED HelloWorld 11:36:20Z (21.338s)

見ての通りで、他のCIと同様Dockerを起動して、指定したactionを実行するらしい。
もちろんGitHub以外のレジストリも使えるので、DockerHubも使える。
また、依存はneedsと指定することで、順番に実行できるっぽい。

https://developer.github.com/actions/creating-workflows/workflow-configuration-options/#example-workflow

試しに下記ようなworkflowを作ってみた。

workflow "Test workflow" {
  on = "push"
  resolves = [
    "1_HelloWorld",
    "ruby"
  ]
}

action "1_HelloWorld" {
  uses = "actions/aws/cli@8d31870"
  runs = [ "printf", "HelloWorld" ]
}

action "0_Shell" {
  uses = "actions/bin/sh@master"
  args = ["ls -ltr"]
}

action "nginx" {
  needs = "0_Shell"
  uses  = "docker://nginx:latest"
  runs  = "nginx -t"
}

action "ruby" {
  needs = "nginx"
  uses  = "docker://ruby:latest"
  runs  = "ruby -v"
}

少し分かりにくいのは、最初のworkflowには最終的に実行したいactionを指定しておいて、逆引きしながらneedsでactionを指定していくところ。
上記のような簡単な例だと特に問題ないが、複雑になってくると頭がこんがらがりそう。
また、action名に数字を入れているのは、actionの表示が下記のようにアルファベット順になるので試しに数字を入れたら数字順になるか試した。

DockerHubからイメージを取得する場合は docker:// でイメージを指定するだけで良い。
どこかでプライベートレジストリ(AWSのECRとか)を使用している場合も、もちろん指定できるっぽい。
ちなみに上記の実行結果は下記のようになった。

秘匿情報などは Settings にある Secrets を使うと直書きしなくても使えるらしい。
この辺はまたおいおい検証していこうと思う。

さわってみて

ドキュメントは充実しているし、workflowの書き方もわかりやすいので、とても便利そう!という所管を得た。
まだ、ベータではあるものの、普通に使えそうな予感がしている。
今回はまだ触りの部分だけだったので、いずれもう少し実践的なことをやってみようと思う。

<p style='padding: 5px;'>