def yasuharu519(self):

日々の妄想

GitHub Actions の制限と Action の作り方

TL;DR

公式ドキュメントが結構充実してるので、そっち読むだけでだいたいのことはできる。

GitHub Actions - GitHub Developer

GitHub Actions とは

GitHub Actions とは今年2018年の GitHub のイベントである GitHub Universe で発表された、GitHub の新しい機能です。

GitHub Actions

現状はパブリックベータ版として提供されており、サインアップを行い、GitHub から使用制限が解除されることで使用することができるようになります。GitHub Actions のページの Sign up for the beta からサインアップができます。 僕自身も10月の GitHub Universe で発表されたあとすぐに登録を行い、この間ようやく使用できるようになりました。

また、まだベータ版であることから、使用できるようになっても、現状では Private repository にしか設定できないようになっています。 (最初 Actions のタブがあるものとないものがあってよくわからなかった)

GitHub Actions の制限

GitHub Actions が発表されたとき、"現状のCIサービスを置き換えてしまうのでは!?" という声もありました。 簡単に置き換える部分もありそうですが、いくつか制限があります。

Workflow limitations

  • 各ワークフローは最大58分間実行可能
  • 各ワークフローのActionの上限は 100
  • 1リポジトリあたり同時に実行できるワークフローは2つまで
  • アクション内のタスクは他のトリガーを実行できない (push イベントで実行されたワークフローは他の Action トリガーを実行できない)
    • ワークフロー同士でループになることを防いでそう?

また、GitHub Actions が実行される環境はこちらにまとめられています。

Runtime environment resources

  • 1つの仮想CPU
  • 最大 3.75GB のメモリ
  • ファイルシステムへの書き込み
    • /github/home, /github/workspace などの領域が用意され、後続のActionでも使用可能
  • 100GB のディスク

ただ、こちらは現状での制限ということで、パブリックリリースの際は変更される可能性が高いです。

Action の作り方

Action の作り方については、いくつか作成の流れをまとめた記事も発表されています。

Introducing GitHub Actions

また、公式のチュートリアルを追うだけでも雰囲気がつかめるかと思います。

Creating a new GitHub Action

読むとわかると思いますが、Action の実態は決められたフォーマットで作成された Docker イメージ です。 決められたように Dockerfile を作成すると自分で好きな Action を作成することが可能です。すごい!

Action の指定の方法は Using a Dockerfile image in an action のページにまとめられています。

  • GitHub のパブリックリポジトリ
    • {user}/{repo}@{ref} の形式で指定
  • GitHub のパブリックリポジトリのサブディレクト
    • {user}/{repo}/{path}@{ref} の形式で指定
  • ワークフローのファイルからの相対パス
    • ./path/to/dir の形式で指定
  • Docker Hub のイメージ名
    • docker://{image}:{tag} の形式で指定
  • パブリックレジストリの Docker イメージ名
    • docker://{host}/{image}:{tag} の形式で指定

などが使用可能です。 Docker Hub にアップされているものはそのまま使用可能ですし、GitHub のパブリックリポジトリのものは Docker build 等を行ってレジストリにアップせずとも、そのまま使用可能です。

また、現状ある Action をまとめたリポジトリも登場しています。 正直まだ GitHub スタッフが作ったものが多いのが現状です。

https://github.com/sdras/awesome-actions

GitHub universe でも HashiCorp の Mitchell Hashimoto が発表していたせいか、terraform もいち早く公式の GitHub Actions を提供しています

HashiCorp Terraform:GitHub ActionsでPull Requestのレビューを簡素化

https://www.terraform.io/docs/github-actions/getting-started/

早速作ってみた

まずは体験してみないとわからんということで、簡単な echo アクションをつくってみました。 このアクションは Arg として設定された文字列をただ吐くというだけの簡単なものです。 Action を作成するために必要なものは Dockerfile と entrypoint シェルの準備です。

https://github.com/yasuharu519/actions/tree/master/echo

面白いのは、Dockerfile で Docker の LABEL を設定しておくことで、ワークフローのビジュアルエディタで表示されるアクション名や、アイコン、カラーを選択します。

LABEL "com.github.actions.name"="Hello World"
LABEL "com.github.actions.description"="Write arguments to the standard output"
LABEL "com.github.actions.icon"="mic"
LABEL "com.github.actions.color"="purple"

選択可能なカラー・アイコンはこちらから参照できます。

LABEL - Creating a Docker container

上記アクションは、パブリックリポジトリとして作成しているので、ワークフロー側では、

action "Echo" {
  uses = "yasuharu519/actions/echo@master"
  args = "Hello world"
}

として参照することで使用することができます。

Action 実行の結果のログ等も GitHub 内で見れるので、いままで CircleCI 等のCIサービスで設定していたジョブは置き換え可能なのではないかと思いました。

まとめ

GitHub Actions が使えるようになったので、簡単に試してみました。 外部のCIサービスを使用すると、わざわざ画面が切り替わったり、それぞれの書式を覚えないといけないといったことがありましたが、特定のアクション時にコマンドを実行するだけといったような簡単なジョブの場合は GitHub Actions を使ったほうが楽になりそうです。 一方で GitHub Actions で使用できるマシンリソースも制限があるため、重いビルドジョブや複雑なジョブなどはまだまだ 外部CIサービスのほうが使い勝手はよさそうに思いました。

これからいろんな Action が登場するのが楽しみです :)