【Github】Github Custom Action ~ Docker コンテナー ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/06/27/220219

の続き。

 前回は、Github Custom Action の JavaScript をやったので、
今回は、Docker コンテナーのアクションについて取り上げる

目次

【1】Docker コンテナーのアクション
【2】使用上の注意
 1)セルフホステッドランナ時の注意点
【3】サンプル
 0)前提条件
 1)リポジトリの作成
 2)action.ymlの作成
 3)Dockerfileの作成
 4)ローカルでのテスト
 5)GitHub Actionsでのテスト

【1】Docker コンテナーのアクション

* Docker コンテナー生成し、その上で動くアクション

https://docs.github.com/ja/actions/creating-actions/about-custom-actions#docker-container-actions

【2】使用上の注意

1)セルフホステッドランナ時の注意点

* セルフホステッドランナの場合、Dockerをインストールしてある必要がある
 => docker を内部的に使うので、当たり前っちゃー当たり前だが。

https://docs.github.com/ja/actions/creating-actions/about-custom-actions#docker-container-actions

【3】サンプル

* 「0)前提条件」~「1)リポジトリの作成」の流れは、以下の関連記事と同じ

https://dk521123.hatenablog.com/entry/2024/06/27/220219

0)前提条件

* 以下がインストールされていること
 + git
 + docker [ローカル上確認する場合。Self-hosted runnerの場合は必須]
 => Docker 使うので、Linux上で作業することを推奨

Node.js ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/06/000000

1)リポジトリの作成

mkdir hello-world-docker-action
cd hello-world-docker-action

# Git初期化
git init
git add .
git commit -m "initial commit for hello world of custom docker action"

最終的な主なフォルダ構成

hello-world-docker-action
├─.github
│  └─workflows
│        └─ demo.yml
├─action.yml
├─Dockerfile
└─entrypoint.sh ... 改行はLFであること(特にWindowsで注意)

2)action.ymlの作成

* 前回との違いは、runs 部分のみ。

https://docs.github.com/ja/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-docker-container-actions

action.yml

name: 'hello_world_docker_demo'
description: 'This is just hello world for docker...'
branding:
  icon: check-circle
  color: orange
inputs:
  input_id1:
    description: 'This is a sample input'
    required: true
    default: 'Hi, world'
outputs:
  output_id1:
    description: 'This is a sample output1'
# ★ここに注目
runs:
  using: 'docker'
  image: 'Dockerfile'
  env:
    INPUT_ID1: ${{ inputs.input_id1}}

3)Dockerfileの作成

[1] Dockerファイルを作成

FROM amazonlinux
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

[2] 周辺のBashファイル(entrypoint.sh)を作成

#!/bin/bash

if [ -z "${INPUT_ID1}" ]
then
  echo "No input data..."
  exit 1
fi

echo "output_id1=${INPUT_ID1}" >> "${GITHUB_OUTPUT}"
cat "${GITHUB_OUTPUT}"

[3] entrypoint.shを実行可能にする

$ git add entrypoint.sh
$ git update-index --chmod=+x entrypoint.sh

$  chmod +x entrypoint.sh

補足:Docker コンテナアクションで失敗終了コードを設定する
https://docs.github.com/ja/actions/creating-actions/setting-exit-codes-for-actions#setting-a-failure-exit-code-in-a-docker-container-action

# Docker コンテナー アクションを作成する場合は、
# entrypoint.sh スクリプトにエラー終了コードを設定できます。
# 次に例を示します。

if <condition> ; then
  echo "Game over!"
  exit 1
fi

4)ローカルでのテスト

# Dockerビルド
$ docker build -t hello-world-docker-action:latest ./

# Docker実行
$ docker run --rm --name hello-world-docker-action  \
-e INPUT_ID1="Hello world!!" -e GITHUB_OUTPUT=/dummy.txt hello-world-docker-action:latest
# 以下が表示されたらOK
output_id1=Hello world!

5)GitHub Actionsでのテスト

[1] コミットおよびハッシュタグ取得

$ git add .
$ git commit -m "[add] add a container action"

# ハッシュタグ取得
$ git show --format='%H' --no-patch
# 完全なハッシュ %H / 短縮版のハッシュ %h
# --no-patch: コミットの diff 出力を行わないようにする
1bba806...

[2] .github/workflows/demo.yml 作成

name: DemoCustomDockerAction

on:
  workflow_dispatch:
jobs:
  demo-custom-action:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Call Demo action
        id: call-demo
        # ★ここ修正★
        uses: your-github-user-name/hello-world-docker-action@1bba806...
        with:
          input_id1: 'Hello world!!!?'
      - name: Show result
        run: |
          echo ${{ env.output_id1 }}
        env:
          output_id1: ${{ steps.call-demo.outputs.output_id1 }}

[3] コミットおよびハッシュタグ取得

# Step1: githubで新たにrepositoryでリポジトリ作成
#  => <Your-ID>@hello-world-docker-action

# Step2: コミット
$ git add .
$ git commit -m "[add] add a Github workflow"
$ git show --format='%H' --no-patch
# 1bba806... ってなるので、修正し、またコミット

# Step3:  Remote へ Push
$  git remote add origin https://github.com/dk521123/hello-world-docker-action.git
$ git push -u origin master

参考文献

公式ドキュメント
https://docs.github.com/ja/actions/creating-actions/creating-a-docker-container-action
一般サイト
https://aadojo.alterbooth.com/entry/2023/06/01/183019
メモ
https://qiita.com/ohnitakahiro/items/d581317f5473a68ca368

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Custom Action ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/06/27/220219
Github Custom Action ~ 複合アクション ~
https://dk521123.hatenablog.com/entry/2024/06/29/021837
Github Custom Action ~ Custom Actionを使ってもらうには ~
https://dk521123.hatenablog.com/entry/2024/06/30/224058
Git ~ 基本編 / 基本コマンド ~
https://dk521123.hatenablog.com/entry/2020/10/02/000000