🦁

actを使ってGitHub Actionsをローカル実行する

2022/12/30に公開

背景

随分前から名前は知っていたのですが、恥ずかしながらいつか使おうと思って、使わず時間だけが経過し(ホント駄目な大人だ)。。。
このままだと時代に置いていかれそうなので、年末年始の時間ある時に使ってみました。

https://github.com/nektos/act

環境

機種 : MacBook Pro 2021(M1 Max)
キーボード : USキーボード
OS : Monterey(12.2.1)
act version 0.2.34

試したリポジトリ

https://github.com/katsuya-n/docker-ubuntu

インストール

brewでインストールします。

$ brew install act

バージョンを調べてみるとメジャーバージョンはまだ0なんですね。まだまだ開発中なのかしら。

$ act --version
act version 0.2.34

準備

今回はUbuntuのDockerコンテナを起動し、簡単なコマンドを実行するworkflowファイルを作成しました。

docker-compose.yml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
Dockerfile
FROM ubuntu:22.10

RUN apt-get update

Makefileは特段不要なのですが、コマンドを打つのが面倒なのでこちらも用意しました。

Makefile
bash:
	docker compose run --rm app bash

workflowファイルは、Pull Requestのときに

  • コンテナのbashを起動する
  • dateコマンドを叩く

という至ってシンプルな2コマンドにしてみます。

.github/workflows/sample.yml
name: Sample

on:
  pull_request:

jobs:
  sample:
    runs-on: ubuntu-latest
    steps:
    - name: checkout
      uses: actions/checkout@v3
      
    - name: build
      run: docker compose build
    
    - name: exec docker container bash
      run: make bash
    
    - name: exec date
      run: date

これらをGtiHub Actionsの方で、Pull Requestを作成したときに正常終了しているかを確認しておきます。

ローカルで実行してみる

actで実行できる一覧を表示してみます。

$ act -l
WARN  ⚠ You are using Apple M1 chip and you have not specified container architecture, you might encounter issues while running act. If so, try running it with '--container-architecture '. ⚠  
Stage  Job ID  Job name  Workflow name  Workflow file  Events      
0      sample  sample    Sample         sample.yml     pull_request

っと表示できたのでOKですが、警告が表示されてますね。M1使っている場合は--container-architecture linux/amd64を実行時に指定していないと、actの実行中に問題が発生するかもね、とのことです。M1良いだけどdockerとの相性が相変わらずイマイチですね〜

というわけで、いよいよ実行していきます。act イベント名で実行できます。イベント名は何も指定しない場合は、on: pushとなり、今回はpull_requestにします。

act pull_request --container-architecture linux/amd64
? Please choose the default image you want to use with act:

  - Large size image: +20GB Docker image, includes almost all tools used on GitHub Actions (IMPORTANT: currently only ubuntu-18.04 platform is available)
  - Medium size image: ~500MB, includes only necessary tools to bootstrap actions and aims to be compatible with all actions
  - Micro size image: <200MB, contains only NodeJS required to bootstrap actions, doesn't work with all actions

Default image and other options can be changed manually in ~/.actrc (please refer to https://github.com/nektos/act#configuration for additional information about file structure)  [Use arrows to move, type to filter, ? for more help]
  Large
> Medium
  Micro

actを初めて実行する場合にデフォルトで使用するイメージを選んでねと言われます(下記のリンク参照)。
今回はMediumにしておきます。

https://github.com/nektos/act#first-act-run
https://github.com/nektos/act#runners

で実行はできて10分くらい待ったのですが、docker compose run --rm app bashがいつまでたっても動かないので一旦killしました。

中でbashを起動しているのが不味いのかな?と思い少しコマンドを変えて実行してみると成功できました。

.github/workflows/sample.yml
-   - name: exec docker container bash
-     run: make bash
+   # - name: exec docker container bash
+     # run: make bash
+   - name: exec docker container exec date
+     run: docker compose exec app date
$ act -j sample --container-architecture linux/amd64
[Sample/sample] 🚀  Start image=catthehacker/ubuntu:act-latest
[Sample/sample]   🐳  docker pull image=catthehacker/ubuntu:act-latest platform=linux/amd64 username= forcePull=false
[Sample/sample]   🐳  docker create image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
[Sample/sample]   🐳  docker run image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
[Sample/sample] ⭐ Run Main checkout
[Sample/sample]   🐳  docker cp src=/Users/k_nakano/MyWork/public/docker-ubuntu/. dst=/Users/k_nakano/MyWork/public/docker-ubuntu
[Sample/sample]   ✅  Success - Main checkout
[Sample/sample] ⭐ Run Main exec docker container exec date
[Sample/sample]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/1] user= workdir=
| Sat Dec 24 16:10:19 UTC 2022
[Sample/sample]   ✅  Success - Main exec docker container exec date
[Sample/sample] ⭐ Run Main exec date
[Sample/sample]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/2] user= workdir=
| Sat Dec 24 16:10:19 UTC 2022
[Sample/sample]   ✅  Success - Main exec date
[Sample/sample] 🏁  Job succeeded

またMakefileをdocker compose run --rm app bashからdocker compose run --rm app echo 'hello'などに変更してみると普通に成功できたので、やはりbash起動が悪そうでした。

ざっとGitHubのissue見て、それっぽいやつを見つけれませんでしたが、バグがそれなりにあるのか、M1だからか、GitHub Actionsの環境と厳密に同等ではないからかわかりませんが、ググってみると動かない場合も結構あるようです。
めちゃくちゃ良いって感じではないですが、ローカルで軽く動かしたい、一部分だけ実行してみたいといった場合には利用できそうです。

株式会社ゆめみ

Discussion