Open3

GitHub Actions で private リポジトリの actions や workflows を共有する

じょーじじょーじ

共有したアクションから、別の共有アクションを呼び出す

試した流れ

Composite Action を同一リポジトリで共有するときは相対パスで指定していたが、共有アクションから相対パスで指定すると、共有アクションを利用しているリポジトリの相対パスになってしまう。

${{ github.action_path }} を使えばいけるか検証してみてたが、uses は動的な値を組み込むと format error になってしまう。
以下は実際のエラーメッセージから抜粋

Expected format {org}/{repo}[/path]@ref. Actual '${{ github.action_path }}/.github/actions/my-action'
Error: System.FormatException: Input string was not in a correct format.

公式ドキュメントを確認してみる。

再利用可能なワークフロー ファイルを参照するには、次のいずれかの構文を使用します。
{owner}/{repo}/.github/workflows/{filename}@{ref}パブリックとプライベートリポジトリの再利用可能ワークフローの 。
./.github/workflows/{filename} は同じリポジトリ内の再利用可能なワークフローの場合。

ref: https://docs.github.com/ja/actions/using-workflows/reusing-workflows#calling-a-reusable-workflow

結論

別の共有アクションを呼び出したい場合、タグを打って、参照する uses: octo-org/another-repo/.github/workflows/workflow.yml@v1 が正解。
(main ブランチを参照してしまうと、v1 指定いるのに中で v2 が呼ばれることになるので NG)

余談

共有する Reusable Workflow から、共有アクションを呼び出すようなケースでも同様。

じょーじじょーじ

ディレクトリ構成と Lint の話

呼び出す際にディレクトリを指定することになるので、private リポジトリのディレクトリ構成自体は自由にしてよい。
ただし、後述する Lint が .github/workflows ディレクトリ配下しかチェックしないので、Lint を導入する場合は一択になる。

Lint 周りはこの本が大変参考になる。
https://zenn.dev/tmknom/books/pragmatic-composite-action/viewer/lint
無料なのが不思議なレベルの本です。Lint 以外でもお世話になりました。

上記、本で紹介されている actionlint というツールですが、これを導入する場合には .github/workflows に置くことになる。
関連する issue: https://github.com/rhysd/actionlint/issues/242

ワークフローが .github/workflows に置くことになるので、アクションも .github/actions に置くのが自然かなと思います。