Docker + Pythonを使用したGitHub Actionを自作する
概要
Github Actionsで使用できるActionを自作する方法について調査してみました.
Actionを自作できると,複数のワークフローや他のレポジトリなどActionを使い回すことができ,非常に便利です.
今回はDockerを使用してGithub Actionを自作する方法について調べたので,こちらにメモを残します.
今回作成したコードは,こちらに公開しております.
Actionの作成方法
Github ActionsにおけるActionの作成方法は主に3つあります.
参考: About custom actions - GitHub Docs
Composite Action
他で定義されたActionや処理などを,ひとまとまりのActionとして定義するものです.
dev/prodで共通の処理や,他のレポジトリなどでも使いまわしたい複数の処理を,
1つのActionとして扱うことができます.
参考: [GitHub Actions] Composite Actionを使って再利用可能なActionを作ろう
JavaScriptを用いたAction
node.jsを使用したActionです.
後述するDockerコンテナを使用したActionに比べて,コードがシンプルで,高速に動作しやすいようです.
Dockerコンテナを使用したAction
Dockerfileに定義された処理を実行するActionです.
Dockerを使用するため言語に依存しません.
Dockerイメージは逐次ビルドできるのはもちろん,
Dockerhubなどで公開されているDockerイメージなども使用することができます.
今回は,このDockerコンテナを使用した方法について,焦点を当てていきたいと思います.
Dockerコンテナを使用したActionを作成する
それでは実際にDockerコンテナを使用したActionを作成してみます.
今回はPythonのスクリプトを,Dockerコンテナ内で実行するActionを作成してみます.
ディレクトリ構成は以下のようなものを想定しています.
. ├── .github │ └── workflows │ └── workflow_from_docker.yml ├── Dockerfile ├── action.yml └── main.py
今回作成したコードはこちらにて共有しておりますので,良ければご参照ください.
Pythonスクリプトの準備
まず簡単なPythonスクリプトをmain.py
という名前で作成します.
内容はレポジトリの名前を使用して,挨拶を出力するコードです.
Github Actionsにおける入力は,INPUT_<変数名>
という環境変数で扱うことができます.
import os def main() -> None: repository = os.getenv("INPUT_REPOSITORY") print(f"Hello world from github actions in {repository}!") if __name__ == "__main__": main()
Dockerfileの作成
続いてこちらのPythonスクリプトを実行するDockerfileを作成します.
FROM python:3.10.1-buster COPY main.py /main.py ENTRYPOINT ["python", "/main.py"]
自作Actionを定義する
それでは,Acitonを作成します.
レポジトリルートにaction.yml
というファイルを作成し,以下を記述します.
Dockerコンテナを用いたActionでは,runs
キーにusing: 'docker'
とimage: 'Dockerfile'
を指定します.
また,Actionの入力はinputs
で記述することができます.
今回はレポジトリ名を取得するために,GitHub Actions内で使用できるコンテキストである{{ github.repository }}
を使用しました.
name: 'Hello World' description: 'Hello world from github actions' inputs: REPOSITORY: description: github repository name required: true default: ${{ github.repository }} runs: using: 'docker' image: 'Dockerfile'
自作Actionを使用したワークフローを作成する
最後に先ほど作成したActionを使用したワークフローを作成します.
.github/workflows
ディレクトリの中に,workflow_from_docker.yml
というファイルを作成します.
同じレポジトリ内での自作したアクションは,uses: ./
で使用することができます.
on: [push, workflow_dispatch] jobs: github_actions_sample: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run github action using docker uses: ./ with: REPOSITORY: ${{ github.repository }}
作成したActionの動作を確認する
上記で作成したコードをGitHubのレポジトリにpushし,ワークフローが動いているかを確認してみます.
GitHubのレポジトリページから,Actionsのタブをクリックします.
ワークフローをクリックし,そのワークフロー内のjobをクリックします.
するとログが確認でき,無事にHello world from github actions in yiskw713/docker_gh_actions_sample!
と出力されているのが確認できました!
まとめ
Dockerを用いてGitHub Actionを自作してみました.
Dockerを用いることで言語によらず,様々な処理をGitHub Actionsで実行できるようになるので,今後色々と遊んでみたいです.
参考
- yiskw713/docker_gh_actions_sample: custom github action using docker
- About custom actions - GitHub Docs
- Creating a Docker container action - GitHub Docs
- Metadata syntax for GitHub Actions - GitHub Docs
- GitHub Actions用のアクションを自作する
- [GitHub Actions] Composite Actionを使って再利用可能なActionを作ろう