アクションを使ってみる
まずは、すでに作成され、公開されているアクションを使ってみましょう。ここでは実際の開発現場でもよく使うCheckoutアクションを使ってみます。
「リポジトリにあるスクリプトを実行したい」と思っても、ワークフローを実行している環境にはリポジトリの情報はありません。そのためまずはリポジトリのデータを用意する必要があります。このCheckoutアクションを利用すれば、ワークフロー実行環境でリポジトリをチェックアウトし、ワークフローからリポジトリにアクセスできます。
以下のサンプルコードでは、(このワークフローがある)リポジトリをチェックアウトし、README.mdの内容を表示しています。リポジトリのルートにREADME.mdが存在しないとエラーになりますので、事前に準備してから実行しましょう。
name: Checkout action demo
on:
push:
jobs:
use-checkout-action-job:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Show README.md
run: head -n 2 README.md
アクションの指定にはusesキーを使います。uses: actions/checkout@v4の部分がアクションの指定です。@v4の部分はタグを指定しています。1つ目のステップでリポジトリがチェックアウトされ、2つ目のステップでチェックアウトした情報にアクセスしています。
アクションによっては、アクションへの入力値やアウトプットが定義されています。何を指定できるかはアクションによって異なるため、それぞれのドキュメントを確認しましょう。
アクションを作ってみる
それでは簡単なアクションを自分で作ってみましょう。「複数のメッセージの中からランダムで選択したメッセージを表示する」アクションを作ります。コードをプッシュしたメンバーに感謝のメッセージを表示してみたいと思います。
アクションを作る方法は3つあります。ワークフロー内のステップをまとめて1つのアクションにする方法(公式ドキュメントでは複合アクションと表現されています)、Dockerコンテナを利用する方法、JavaScriptで作る方法があります。今回はJavaScriptを利用します。
事前準備として必須の作業はありませんが、作成したJavaScriptのコードを手元で簡単に動かしたい場合はNode.jsをインストールしておきましょう。また、今回はリポジトリ内からのみ参照できるようなプライベートアクションを作成します。
手順は以下の通りです。
-
.github/actions/thanksフォルダを作成する -
.github/actions/thanksフォルダにaction.ymlを作成する -
.github/actions/thanksフォルダにindex.jsを作成する -
.github/workflowsフォルダにアクションを呼び出すcall-actions.ymlを作成する
詳しく説明していきます。
.github/actions/thanksフォルダを作成する
リポジトリ内からのみ参照するアクションを作る場合は、リポジトリのどこにアクションを作成しても問題ありません。GitHub Actionsに関するコードをまとめて管理するため、.githubフォルダにactionsフォルダを作成し、ここに自作アクションに関するコードを保存していきましょう。今回のアクションの保存場所として .github/actions/thanksフォルダを作成します。
ここでは今までのサンプルコードを実装したリポジトリにそのまま作成する手順で進めます。そのため、.githubフォルダやこの後登場する.github/workflowsフォルダはすでに作成済みのものとして進めます。
action.ymlを作成する
アクションにはメタデータを記載するYAMLファイルが必要です。アクションの入力、出力、実行の構成を定義します。ファイル名はaction.ymlかaction.yamlのどちらかである必要があります。
.github/actions/thanksフォルダにaction.ymlを作成し、以下の内容を記載します。
name: 'Thanks Message' description: 'Outputs a kind message during your CI run' runs: using: 'node20' main: 'index.js'
今回はアクションに対する入力もアクションからの出力もないため、それらに関する記載はありません。以下で1要素ずつ説明します。
name
アクションの名前です。必須項目です。
description
アクションの説明です。必須項目です。
runs
実行の構成を指定します。複合アクションなのか、Dockerコンテナアクションなのか、JavaScriptアクションなのか、という情報と実行方法を指定します。今回はJavaScriptアクションですので、以下のように指定します。
using
mainで指定されたコードを実行するために使用されるランタイムを指定します。node20という指定はGitHub Actionsが提供するNode.js v20ランタイムを指しています。
main
アクションのコードが実装されたファイルを指定します。usingで指定されたランタイムでこのファイルが実行されます。
アクションのコードを実装する
アクションの具体的な処理を実装しましょう。先ほど作成したaction.ymlで指定したファイル名と合うように、index.jsというファイル名にします。
.github/actions/thanksフォルダにindex.jsを作成し、以下の内容を記載します。
const messages = [ "開発お疲れ様。今日もありがとう!", "あなたの積み重ね、ちゃんと伝わってるよ!", "レビューも開発も、心が元気なときがいちばん。", ]; const message = messages[Math.floor(Math.random() * messages.length)]; console.log(message);
messagesに定義したメッセージの中からランダムに一つのメッセージが選ばれ、表示されます。
以上でアクションの完成です!
