#chiroito ’s blog

Java を中心とした趣味の技術について

nektos/actにイベントの情報を渡す

GitHub でリリースするときに、指定したバージョンをワークフロー内で使いたい時にnektos/act ではどうしたら良いか分からなかったので試したメモ。

Webにある記事や GitHub のマニュアルによると、${{ github.event.release.tag_name }} でタグの名前が取得できるらしい。

Webhook のイベントとペイロード - GitHub Docs

しかしながら、どうやってnektos/act へその情報を渡せば良いのかはドキュメントを見ても理解できませんでした。

GitHub - nektos/act: Run your GitHub Actions locally 🚀

test.yml というスモールケースを作って、先ほどの Github のマニュアルとnektos/actのドキュメントを眺めながら調査しました。

name: test

on:
  release:
    types:
      - published

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Deploy Production
        run: |
          export VERSION=`echo ${{ github.event.release.tag_name }} | awk '{print substr($0, 2)}'`
          echo ${VERSION}

その結果、github.event.release.tag_nameevent 以下を要素とした JSON を作ったらうまくいきました。

> cat event.json
{
  "release": {
    "tag_name": "vworkflow_test5"
  }
}

このファイルを使ったactの実行は以下のように -e ファイル名 でできます。

act -W .github/workflows/test.yml -e event.json

nektos/act でシークレットを使う

GitHub Action で Maven Central へアップロードするワークフローを作成していたときに困ったのでメモ

ワークフローは以下のYAMLで、シークレットには以下の2種類があります。

  • ユーザ名やパスワード、パスフレーズのように1行の文字列として表現されるもの
  • 鍵のように複数行からなる文字列として表現されるもの

これらはそれぞれ act へ渡す方法が異なります。

name: Deploy Snapshot

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
          java-package: 'jdk'
          cache: maven
          server-id: 'ossrh'
          server-username: OSSRH_USERNAME
          server-password: OSSRH_PASSWORD
          gpg-passphrase: SIGN_KEY_PASS
          gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}

      - name: Test
        run: mvn -B package --file pom.xml

      - name: Deploy Production
        env:
          OSSRH_USERNAME: ${{ secrets.MAVEN_USERNAME }}
          OSSRH_PASSWORD: ${{ secrets.MAVEN_USER_PASSWORD }}
          SIGN_KEY_PASS: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
        run: mvn -B deploy --no-transfer-progress -DskipTests --file jfr4jdbc-driver/pom.xml

act は以下のように実行します。

act --secret-file secretfile -s MAVEN_GPG_PRIVATE_KEY="$(< gpg.pem)" 

1行で記載できるものは --secret-file ファイル名 として指定し、複数行で記載するものは-s 変数名="$(< ファイル名)"とします。

1行で記載できるシークレットは以下のようにまとめてファイルに記載できます。

> cat secretfile
MAVEN_GPG_PASSPHRASE=xxx
MAVEN_USERNAME=xxx
MAVEN_USER_PASSWORD=xxx

鍵など1行で記載できないシークレットそれぞれファイルを用意します。

> cat gpg.pem
-----BEGIN PGP PRIVATE KEY BLOCK-----

xxxxx
-----END PGP PRIVATE KEY BLOCK-----

WindowsにPodman Desktopを入れた後にIntelliJ IDEAと他のWSLから実行できるようにする

Windows に Podman Desktop を入れると、コマンドプロンプトやGUI上でコンテナを使えるようになります。

それだけだと不便なので、使用しているIDEとWSLからも使えるように設定をした備忘録です。

Podman Desktop を入れると WSL 上に podman-machine-default という Linux が入ります。

> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
podman-machine-default
Ubuntu-22.04

Windows 側の Podman の設定は、SSH を使って podman-machine-defaultへ接続するようになっています。

> podman context list
Name                         URI                                                          Identity                                    Default
podman-machine-default       ssh://user@localhost:50725/run/user/1000/podman/podman.sock  C:\Users\c_hir\.ssh\podman-machine-default  true
podman-machine-default-root  ssh://root@localhost:50725/run/podman/podman.sock            C:\Users\c_hir\.ssh\podman-machine-default  false

ある日、急に繋がらなくなったのでいろいろ試した結果、ホスト名をlocalhostからpodman-machine-defaultのIPにしたらアクセスできるようになった。netsh.exe interface portproxy add v4tov4 で同IPにフォワードしているので不思議。

podman system connection remove podman-machine-default 
podman system connection add podman-machine-default --identity C:\Users\c_hir\.ssh\podman-machine-default ssh://user@172.26.130.33:50725/run/user/1000/podman/podman.sock

IntelliJ IDEA

IntelliJ IDEAのコンテナの設定は Services で行います。

「+」を選択するとメニューが出るので、Docker Connection を選択します。

Docker ダイアログが表示され、特に変更は必要ありません。分かりやすいように名前だけ変えると良いでしょう。ダイアログの下側に Connection Successful と表示されてればOKです。

この設定方法以外にも podman context list で表示された情報を使って、Podman Desktop が作成した WSL へ SSH で接続する方法も可能です。

OK を選択すると、 Services に追加されます。

WSL

SSHの鍵をWindowsからWSLへコピーして、権限を設定

sudo mkdir /root/.ssh
sudo chmod 700 /root/.ssh
sudo cp /mnt/c/Users/c_hir/.ssh/podman-machine-default /root/.ssh/podman-machine-default
sudo chmod 600 /root/.ssh/podman-machine-default

鍵を使って接続できることを確認

> sudo ssh -i ~/.ssh/podman-machine-default user@localhost -p 50725 exit

podman にリモートホストの情報を登録

> sudo podman system connection add -d --identity /root/.ssh/podman-machine-default --socket-path /run/user/1000/podman/podman.sock podman ssh://user@localhost:50725

情報が登録されたことを確認

> sudo podman system connection list
Name        Identity                           URI
podman*     /root/.ssh/podman-machine-default  ssh://user@localhost:50725/run/user/1000/podman/podman.sock

イメージとコンテナの状況を見てみてもなぜか見えない・・・

> sudo podman image list
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
> sudo podman container list
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

なぜか実行はできる

> sudo podman -r run quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:e748d51595bc62e996d56ccaa873a5f520ab314d5c63aca3b53b4110129d42d1
Copying config sha256:54c80734fe405a23783a26881d74c5842f6b047f021b029c0b672565101fef76
Writing manifest to image destination
Storing signatures
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Documents: https://docs.podman.io
Twitter:   @Podman_io

再びイメージとコンテナの状況を見てみてもやはり見えない・・・

> sudo podman image list
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
> sudo podman container list
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

Podman DesktopだとこのWSL上で扱ったイメージとコンテナは見られます。