GitHub ActionsのAsciiDoc用アクションの仕組み(2)
2020-04-16
azblob://2022/11/11/eyecatch/2020-04-16-github-actions-asciidoc-2-0.png

はじめに

前回はAsciiDoc出力に利用した「Analog-inc/Asciidoctor-action」アクションの大まかな内容を簡単に解説しました。
今回はその内部で利用しているDockerfileの内容について簡単に説明します。
今回の内容をお読みいただければ、AsciiDoc出力が気軽にできる仕組みについて大まかに知ることができると思います。

前回までの記事について

これまでの記事はこちらにあります。 そちらも合わせてお読みいただけると嬉しいです。

アクションを構成するファイル

前回のおさらいになりますが、「Analog-inc/asciidoctor-action」のリポジトリ には、以下の8つのファイルがあります。
これらの中で実際にアクションの処理を行うファイルは前回解説した「action.yml」以外に「Dockerfile」「entrypoint.sh」があります。
今回はその残りの2つ、実際のAsciiDoc出力環境である「Dockerfile」「entrypoint.sh」の解説をしたいと思います。

  • into.github:workflows (サンプルのワークフローのファイル)
  • .gitignore : (Gitの管理に含めないファイルを指定するためのファイル)
  • Dockerfile : (AsciiDoctorコマンドを利用するコンテナ)
  • LICENSE : (アクションのライセンス)
  • README.adoc : (アクションのREADME)
  • _config.yml : (Marketplaceでのテーマの指定)
  • action.yml : (アクションの実体となるファイル)
  • entrypoint.sh : (コンテナ内で実行されるシェルスクリプト)

Dockerfileについて

Dockerfile(ドッカーファイル)はテキスト形式のドキュメントで特定のDockerイメージを構築するための情報を記述するファイルです。
今回は実際に利用しているファイルの内容だけ簡単に説明しますが、今後の記事ではDockerのイメージについて少し解説したいと考えています。
Dockerfileついて詳しく知りたい方は下記のリファレンスを参照してください。

出力アプリケーションがインストールされたイメージを拝借する

Dockerfileに記述する命令は必ずFROMから始まります。
元となる(ファイルシステムにアプリケーションなどが入った)任意のイメージをパブリックリポジトリからイメージをプルしています。
今回はDocker HubからAsciidoctor公式なイメージである「asciidoctor/docker-asciidoctor」を利用しています。

次に記載するLABELは処理自体には影響がない部分で、このDockerfileが作成するイメージのバージョンを記述しています。

# Container image that runs your code
FROM asciidoctor/docker-asciidoctor

LABEL "version"="1.0"

※ 信頼できる提供元の公式なイメージを利用することはとても重要です。知らない誰かが作ったイメージには意図しないソフトウエアが紛れ込んでいることがあり、その結果セキュリティリスクやリソースの無駄遣いが予想されます。

処理の入り口を作る

ここで重要なポイントは、一番下に記述されているENTRYPOINTの指定です。
ENTRYPOINTには適切なデフォルトのコマンドと引数を指定します。
またDockerコンテナの起動時に引数を付けた場合は、ENTRYPOINTに指定したENTRYPOINTで指定した全要素の後ろに追加することができます。
つまり、前回の記事で解説したaction.ymlの引数をENTRYPOINTで指定したコマンドの後ろに渡すことが可能です。

今回は「ENTRYPOINT ["/entrypoint.sh"]」を指定していますが、その指定したシェルスクリプトである「entrypoint.sh」をENTRYPOINTの直前にある「COPY entrypoint.sh /entrypoint.sh」の部分でソースとなるファイルをイメージのファイルシステムにコピーしています。

# Copies your code file from your action repository to the filesystem path `/` of the container

COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

※ ENTRYPOINTの指定が複数ある場合はDockerfileの最後に現れたENTRYPOINTのみ有効です。

シェルスクリプトについて

シェルスクリプトは主にUnix環境やLinux環境で使用されるシェルまたはコマンドライン向けのスクリプト言語です。
シェルスクリプトはファイル操作、プログラム実行など実行される一連の処理を記述することで自動化やショートカット・繰り返しなどの処理に利用することで作業を効率化することができます。
今回は実際に利用しているファイルの内容だけ簡単に説明します。

処理の入り口用のスクリプト

「entrypoint.sh」はbashで記述されたスクリプトです。
このスクリプトの重要な役割として、エラーの時にワークフローの結果がグリーンで終わらない様にエラーを検知したら即座に処理を終了することです。
このために処理の最初に「set -e」を指定しています。

続く「bash -c "$@"」は、このシェルスクリプトに対する引数文字列を展開しコマンドとして実行します。これによりDockerコンテナの起動時に引数を受け取って処理を行うことができます。
つまりアクションの呼び出し元ワークフローから受け取った引数をbashのコマンドとして実行している部分がこの処理になります。

#!/bin/bash
set -e
bash -c "$@"

まとめ

今回は「Analog-inc/asciidoctor-action」ので利用している「Dockerfile」「entrypoint.sh」について簡単に解説しました。
次回はのコンテナについて掘り下げて説明したいと思います。