Github Actionsに入門する
本記事の目的とゴール
目的:Github Actionsのイントロダクションとして、全体像を理解してと次の学習ステップを示すこと
目標:Hello, World!レベルのワークフローの作成・編集・実行ができる
Github Actionsとは
Githubに組み込まれた実行環境の仕組みのこと。
「実行環境の”仕組み”」という表現について、Githubが提供している実行環境(Github hosted ランナー)と、利用者が自ら用意する実行環境(Self hosted ランナー)の2種類があるため。
立ち位置的にはAWSのStep Functions+Lambdaのような感じ。
何に利用するかは利用者次第ではありますが、CI/CDで利用するイメージが強いです(と私自身が認識しています)。
CI/CDで利用するというのは、ざっくりと「特定のブランチに変更がプッシュされたタイミングでビルドが走って、予め用意されたテストが走って、そしてテストが通ったら自動的にデプロイまでしてくれる」くらいに思っていただけたら良いかと思います。
全体像と用語
大枠を掴むだけならワークフロー、イベント、ジョブの3つで足りると思います。
-
ワークフロー
AWSで言うStep Functions的な立ち位置。
その名からイメージできるかと思いますが、用途別に作成する処理の一番大きな枠組みです。
実態としてはYAMLファイルです。
このYAMLファイルは、ワークフローを作成するリポジトリの.github/workflows/配下に配置されます(します)。
YAMLにはジョブという個々の処理(Lambdaの関数的な立ち位置)と、その処理がどのように動作するかという動作の流れなどが記述されます。
ジョブの流れを定義したもの、と言えます。 -
イベント
ワークフローを実行する条件に利用できる要素。
リポジトリにプッシュされた(push)だとか、issueが作成・更新・削除された(issues)だとか、スケジュールされたイベント(Cronで定義)、手動イベント(手動で実行した場合)、Webhookイベント、外部イベントなどなど、様々あるイベントの例
push: リポジトリにプッシュされたときにトリガーされます。
pull_request: プルリクエストが作成または更新されたときにトリガーされます。pull_request_review: プルリクエストがレビューされたときにトリガーされます。
issues: Issue が作成、更新、削除されたときにトリガーされます。
issue_comment: Issue へのコメントが作成、更新、削除されたときにトリガーされます。release: リリースが作成されたときにトリガーされます。
schedule: 一定のスケジュールに基づいて定期的に実行されます。 -
ランナー
ワークフロー・ジョブを実行する実行環境
Githubでホストしているもの(Github hosted)と自身でホストしているもの(Self hosted)の2つに大別されます。 -
Github hostedランナー
Githubで用意しているサーバレスの実行環境(仮想マシン・コンテナ)のこと。
ワークフロー・ジョブを実行するにあたり、ユーザー側でインフラを稼働させる手間を減らすために用意されています。
JavaScript用にはWindows/macOS/Linuxが用意されています。
他の言語を使用する場合はDockerコンテナを使用する必要がありますが、その場合はLinuxベースに限定されます。 -
Self hostedランナー
ユーザー自身でカスタマイズしたランナーのことです。パブリックリポジトリで利用すると、自分のネットワーク内の自分のランナーでコード実行を許可してますセキュリティリスクがあるため推奨されない点に注意が必要です。
Let's hands on!
肩慣らしとしてHello,Worldをやります。
適当なリポジトリのルートディレクトリに.github/workflows/workflow_name.ymlを作成します。YAMLファイルの記述は下記のようにします。
# workflow_name.yml
name: Hello, World
# プッシュしたときに実行されます
on: push
# ジョブを定義します
jobs:
# ジョブのIDで、ユニークであればどのような文字列でもOK
job1:
# ジョブの名前
name: Hello World
# Github hostedのランナーを利用します、今回はUbuntuのLatest
runs-on: ubuntu-latest
# ジョブの中で具体的にどのような処理を行うかの記述
steps:
- run: echo "Hello, World!"
ファイルができたらリモートリポジトリにPushします。
Githubのリポジトリにアクセスし、Actionsのタブから"Hello, World"という名称のワークフローを選択すると、コミットメッセージとともに実行履歴が確認できます。
コミットメッセージ部分がリンクになっているので、選択して次の画面に進むと実行のサマリが確認できます。さらに、ジョブの名称をクリックすると実行の詳細を確認することができます。
もう少し弄ってみます。
ワークフローにもう1つHello, World!を出力するジョブを追加してPushしました。
# workflow_name.yml
name: Hello, World
# プッシュしたときに実行されます
on: push
# ジョブを定義します
jobs:
# ジョブのIDで、ユニークであればどのような文字列でもOK
job1:
# ジョブの名前
name: Hello World 1
# Github hostedのランナーを利用します、今回はUbuntuのLatest
runs-on: ubuntu-latest
# ジョブの中で具体的にどのような処理を行うかの記述
steps:
- run: echo "Hello, World! 1"
job2:
name: Hello World 2
runs-on: ubuntu-latest
steps:
- run: echo "Hello, World! 2"
再度Github Actionsの画面を確認すると、Pushによって新しいワークフローが実行されていることが確認できます。
学習コンテンツ(次のステップ)
更に学習を進めたい方向け、Kindle Unlimitedを利用している場合は無料で読めるのでオススメです
本記事で取り上げなかった料金体系についてはこちらの記事が分かりやすかったです。
Microsoft Learningの「GitHub Actions の概要」
VS Codeの拡張機能があるようです。この記事執筆時点で私は触ってないので紹介だけ。
おしまい
Github ActionsでHello, World!をやってみました。
私自身、この記事を書きながら触り始めているのですが、やはり動かしてみるだけでだいぶ理解や知識の定着が進みますね。
CI/CDって言うと大層な響きにも感じられますが、スモールスタートで利用できそうという手応えを得られたので挑戦してみて良かったと思いました。
Discussion