yiskw note

機械学習やプログラミングについて気まぐれで書きます

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

今回作成したコードはこちらにて共有しておりますので,良ければご参照ください.

github.com

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 }}を使用しました.

参考: Contexts - GitHub Docs

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のタブをクリックします.

f:id:yiskw713:20220110095805p:plain

ワークフローをクリックし,そのワークフロー内のjobをクリックします.

f:id:yiskw713:20220110095843p:plain

するとログが確認でき,無事にHello world from github actions in yiskw713/docker_gh_actions_sample!と出力されているのが確認できました!

f:id:yiskw713:20220110095913p:plain

まとめ

Dockerを用いてGitHub Actionを自作してみました.
Dockerを用いることで言語によらず,様々な処理をGitHub Actionsで実行できるようになるので,今後色々と遊んでみたいです.

参考