※当サイトの記事には、広告・プロモーションが含まれます。

GitHub Actionsをローカルで実行できるnektos/actを導入してみる

www.publickey1.jp

Kubernetes 1.32でメモリマネージャが正式版となったことが発表されました。これにより、NUMAサーバ上でコンテナ化されたアプリケーションにおいてメモリ割り当てを最適化することによる性能向上などが期待できます。

Kubernetesのメモリマネージャ機能が正式版に。NUMAサーバでCPUとメモリ割り当ての最適化による性能向上など実現 - Publickey

⇧ 何よりも先に「Kubernetes」は気軽に環境構築できるようにして欲しいのよね...

ローカル環境だと、マシンのスペックの問題で、クラスター構成の構築が難しいし、クラウド環境は課金が怖くて試せない...

GitHub Actionsをローカルで実行できるnektos/actを導入のために、Dockerをインストールする

前回「nektos/act」の話で、「Linux」環境に導入するための要件として、「nektos/act」が指定する「Linux ディストリビューション」を用意する必要があり、「ArchLinux」環境を構築しました。

ts0818.hatenablog.com

⇧ 上記では「ArchLinux」環境までしか整っていないので、「Docker」や「Git」などをインストールしていく必要がありますと。

まずは、「nektos/act」は、「Docker Engine API」を利用できる環境がMUSTな要件のため、「ArchLinux」環境に「Docker」をインストールします。

docs.docker.jp

⇧ 公式の手順と、

github.com

⇧「WSL 2(Windows Subsystem for Linux 2)」に「import」して「Linux ディストリビューション」をインストールした場合の特有の問題に対応する必要があり、泥沼にハマる...

そもそも、「ArchLinux」のパッケージ管理ツール「pacman」が利用できるようになっていなかったので、「pacman」を利用できるようにして、「Docker」をインストールする。

で、「WSL 2(Windows Subsystem for Linux 2)」で「systemd」が利用できるように、「/etc/wsl.conf」を作成し、以下の設定を記載。

「WSL 2(Windows Subsystem for Linux 2)」の「ArchLinux」環境からログアウトし、再起動。

再起動後、「systemd」が利用できるようになるので、「WSL 2(Windows Subsystem for Linux 2)」に「import」して「Linux ディストリビューション」をインストールした場合の特有の問題の対応を済ませておく。

で、もう一度、再起動すると、「Docker」のサービスが有効になっていて「Docker」が利用できるようになっていることが確認できるはず。

別途、「sudo」「OpenSSH」とかもインストールしてます。

ユーザーも追加。

sudoも利用できるようにしておく。

⇧「%wheel ALL=(ALL:ALL) ALL」のコメントアウトを外しておく。

とりあえず、「Gitリポジトリ」もローカル環境に必要っぽいので、git cloneが実行できるように「Git」もインストールしておく。

GitHub Actionsをローカルで実行できるnektos/actを導入してみる

ようやっと、「nektos/act」を利用するための要件が整ったので、「nektos/act」をインストールします。

sudo pacman -Syu act

インストールされたのかが分かり辛いのだが、「pacman -Q」でインストール済みのパッケージ一覧を表示したところ、一応、インストールされてはいそう。

とりあえず、「nektos/act」の仕組みが分からな過ぎるので、「ヘルプ」を確認してみた。

[ts0818@Toshinobu-PC ~]$ act -h
Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.

Usage:
  act [event name to run] [flags]

If no event name passed, will default to "on: push"
If actions handles only one event it will be used as default instead of "on: push"

Flags:
      --action-cache-path string                          Defines the path where the actions get cached and host workspaces created. (default "/home/ts0818/.cache/act")
      --action-offline-mode                               If action contents exists, it will not be fetch and pull again. If turn on this,will turn off force pull
  -a, --actor string                                      user that triggered the event (default "nektos/act")
      --artifact-server-addr string                       Defines the address to which the artifact server binds. (default "172.24.91.141")
      --artifact-server-path string                       Defines the path where the artifact server stores uploads and retrieves downloads from. If not specified the artifact server will not start.
      --artifact-server-port string                       Defines the port where the artifact server listens. (default "34567")
  -b, --bind                                              bind working directory to container, rather than copy
      --bug-report                                        Display system information for bug report
      --cache-server-addr string                          Defines the address to which the cache server binds. (default "172.24.91.141")
      --cache-server-path string                          Defines the path where the cache server stores caches. (default "/home/ts0818/.cache/actcache")
      --cache-server-port uint16                          Defines the port where the artifact server listens. 0 means a randomly available port.
      --container-architecture string                     Architecture which should be used to run containers, e.g.: linux/amd64. If not specified, will use host default architecture. Requires Docker server API Version 1.41+. Ignored on earlier Docker server platforms.
      --container-cap-add stringArray                     kernel capabilities to add to the workflow containers (e.g. --container-cap-add SYS_PTRACE)
      --container-cap-drop stringArray                    kernel capabilities to remove from the workflow containers (e.g. --container-cap-drop SYS_PTRACE)
      --container-daemon-socket string                    URI to Docker Engine socket (e.g.: unix://~/.docker/run/docker.sock or - to disable bind mounting the socket)
      --container-options string                          Custom docker container options for the job container without an options property in the job definition
      --defaultbranch string                              the name of the main branch
      --detect-event                                      Use first event type from workflow as event that triggered the workflow
  -C, --directory string                                  working directory (default ".")
  -n, --dryrun                                            disable container creation, validates only workflow correctness
      --env stringArray                                   env to make available to actions with optional value (e.g. --env myenv=foo or --env myenv)
      --env-file string                                   environment file to read and use as env in the containers (default ".env")
  -e, --eventpath string                                  path to event JSON file
      --github-instance string                            GitHub instance to use. Only use this when using GitHub Enterprise Server. (default "github.com")
  -g, --graph                                             draw workflows
  -h, --help                                              help for act
      --input stringArray                                 action input to make available to actions (e.g. --input myinput=foo)
      --input-file string                                 input file to read and use as action input (default ".input")
      --insecure-secrets                                  NOT RECOMMENDED! Doesn't hide secrets while printing logs.
  -j, --job string                                        run a specific job ID
      --json                                              Output logs in json format
  -l, --list                                              list workflows
      --local-repository stringArray                      Replaces the specified repository and ref with a local folder (e.g. https://github.com/test/test@v0=/home/act/test or test/test@v0=/home/act/test, the latter matches any hosts or protocols)
      --log-prefix-job-id                                 Output the job id within non-json logs instead of the entire name
      --man-page                                          Print a generated manual page to stdout
      --matrix stringArray                                specify which matrix configuration to include (e.g. --matrix java:13
      --network string                                    Sets a docker network name. Defaults to host. (default "host")
      --no-cache-server                                   Disable cache server
      --no-recurse                                        Flag to disable running workflows from subdirectories of specified path in '--workflows'/'-W' flag
      --no-skip-checkout                                  Do not skip actions/checkout
  -P, --platform stringArray                              custom image to use per platform (e.g. -P ubuntu-18.04=nektos/act-environments-ubuntu:18.04)
      --privileged                                        use privileged mode
  -p, --pull                                              pull docker image(s) even if already present (default true)
  -q, --quiet                                             disable logging of output from steps
      --rebuild                                           rebuild local action docker image(s) even if already present (default true)
      --remote-name string                                git remote name that will be used to retrieve url of git repo (default "origin")
      --replace-ghe-action-token-with-github-com string   If you are using replace-ghe-action-with-github-com  and you want to use private actions on GitHub, you have to set personal access token
      --replace-ghe-action-with-github-com stringArray    If you are using GitHub Enterprise Server and allow specified actions from GitHub (github.com), you can set actions on this. (e.g. --replace-ghe-action-with-github-com =github/super-linter)
  -r, --reuse                                             don't remove container(s) on successfully completed workflow(s) to maintain state between runs
      --rm                                                automatically remove container(s)/volume(s) after a workflow(s) failure
  -s, --secret stringArray                                secret to make available to actions with optional value (e.g. -s mysecret=foo or -s mysecret)
      --secret-file string                                file with list of secrets to read from (e.g. --secret-file .secrets) (default ".secrets")
      --use-gitignore                                     Controls whether paths specified in .gitignore should be copied into container (default true)
      --use-new-action-cache                              Enable using the new Action Cache for storing Actions locally
      --userns string                                     user namespace to use
      --var stringArray                                   variable to make available to actions with optional value (e.g. --var myvar=foo or --var myvar)
      --var-file string                                   file with list of vars to read from (e.g. --var-file .vars) (default ".vars")
  -v, --verbose                                           verbose output
      --version                                           version for act
  -w, --watch                                             watch the contents of the local repo and run when files change
  -W, --workflows string                                  path to workflow file(s) (default "./.github/workflows/")

⇧ うむ、全く分からん...

とりあえず、

www.memory-lovers.blog

⇧ 上記サイト様を参考に、git cloneしてきてから、試してみた。

まずは、「ArchLinux」環境で、git cloneして、ローカル環境に「Gitリポジトリ」をダウンロード。

プロジェクトの構成は以下。

「.github/workflows/pytest.yml」は、

docs.github.com

⇧ 公式の内容を参考に、以下のような感じに。

â– /home/ts0818/work/test-github-actions-auto-test/.github/workflows/pytest.yml

name: Python package

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r app/requirements.txt
    - name: Test with pytest
      run: |
        pip install pytest pytest-cov
        pytest --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html    

で、実行してみた。

act -W .github/workflows/pytest.yml

⇧ はい、エラー。

そして、コンテナが残るんか~い!

エラーは、「pytest」が「PYTHONPATH」を解釈できないという、どう考えても「pytest」のバグな気がして仕方ないんだが...

「VS Code(Visual Studio Code)」上では、「pytest」が動作してしまうのが余計に混乱させてくれるのよね...

何やら、

stackoverflow.com

⇧ stackoverflowによると、「tests」ディレクトリ配下に「__init__.py」を配置すれば解決するとの情報。

「/home/ts0818/work/test-github-actions-auto-test/app/tests/__init__.py」を作成してみました。(中身は空)

「pytest」が正常に実施されました。

「VS Code(Visual Studio Code)」の「GUI」上で「pytest」を実行した場合は、自動的に「__init__.py」が作成されているってことなんかね?

ちなみに、「WARNING」があったとしても「ERROR」が無く実施された場合、

⇧ コンテナも自動で削除される模様。

「__init__.py」は「tests」ディレクトリ直下にだけ配置すれば良いのか?

⇧「__init__.py」は「tests」ディレクトリ直下にだけ配置すれば良さそう。

「pytest」はコマンドでの実行時に「PYTHONPATH」を指定できるようにしておけば良かったんじゃないかという気がしてならないんだが...

ちなみに、「__init__.py」が無い状態だと、事前に「PYTHONPATH」を設定していてもガン無視されるのよね...

毎度モヤモヤ感が半端ない…

今回はこのへんで。

 

Â