rcmdnk's blog

GitHub Actions 実践入門 (技術の泉シリーズ(NextPublishing))

GitHub Actionsで自作のアクションを作っているものの中で、 Dockerを使ってその中でシェルスクリプトを走らせているようなものがありました。

それをCompositeというスタイルに変更して使うようにしました。

GitHub Actionsの自作方法

GitHub Actionsを自作するには、最初はDockerを使ってその中で何かを走らせるか、 JavaScriptを使って走らせるという2択でした。

Dockerを使うと好きなimageの中で走らせることは出来ますが、 基本的にはそのアクションの中で閉じた作業になります。

したがって、actions/checkoutなどを使ってレポジトリを チェックアウトして、そこで色々セットアップして作業したい、と言った場合には もう一つのJavaScriptを使った方法を使う必要がありました。

ただ、単純なコマンドを呼ぶのにも一々JavaScriptで書いて呼ぶ様なことをしないといけいないので結構面倒だな、と思って、 以前このブログのビルド用のアクションを作った際には、シェルスクリプト書いて それをDockerの中で呼ぶような形にしていました。

が、ちょっと問題が起こって変更が必要になったので、 ついでに色々調べていたところ、Docker、JavaScript以外に Composite(複合コマンド)というものが使える様になっていたのでそれに置き換えてみました。 まあ、かなり前のものなので今更感はありますが。

octopress-actionで起こった問題

rcmdnk/octopress-action at v1

v1の方でやっているのはusing: 'docker'を使っています。

これを使って、ブログのビルドを毎日cronで自動で更新するようにしてるのですが、2021/8/17から 急にエラーを出す様になりました。 何も変えてないのに。。。(実際いくつかやっていて、全部同じエラーが出ています。)

エラーは

Liquid Exception: Pygments can't parse unknown language: sh. in /github/workspace/source/_posts/y_2013/2013-03-07-setup-octopress.md

みたいな感じで、Pygmentsというコードシンタックスハイライトを付けるモジュールがエラーを吐いています。

使ってるバージョンは1.2.1で手元のマシンでも同じものが入っていますが、 問題なく動きます。

もうちょっとエラーを見てみると、

/usr/local/bundle/gems/pygments.rb-1.2.1/lib/pygments/popen.rb:298:in `rescue in mentos': EPIPE (MentosError)
	from /usr/local/bundle/gems/pygments.rb-1.2.1/lib/pygments/popen.rb:245:in `mentos'
	from /usr/local/bundle/gems/pygments.rb-1.2.1/lib/pygments/popen.rb:236:in `highlight'

この辺のところで、mentos.pyというPythonスクリプトを呼んでいてそれが関係してそうな感じ。

ただ、Pythonなどを別途入れてみても変わらず。

よく分かってませんが、成功したものと失敗したものを見比べると、

  • 成功: Current runner version: ‘2.280.1’
  • 失敗: Current runner version: ‘2.280.2’

とrunnerのバージョンが一つ上がってました。 Operating systemはともにUbuntu 20.04.2 LTSで同じ。 Virtual Environment,となっているものも、

  • Environment: ubuntu-20.04
  • Version: 20210810.17から

で同じ。

Comparing v2.280.1…v2.280.2 · actions/runner

わからない。。。

ちょっと調べるのも面倒になってきて 別の方法で無理矢理でもやるか、と思ってちょっと調べたら Compositeが使える、ということでそれに変更しました。

(上の件は他でも問題になったら調べる、かも。。。)

Docker to Composite

rcmdnk/octopress-action at v2

もともとentrypoint.shというシェルスクリプトを用意してその中にブログのビルドをすべて書いてありました。

それをDockerの中で実行していたわけですが、基本的にはこれを変わりにCompsiteとしてそのまま実行してあげればよいだけ。

まず、action.yml

action.yml
1
2
3
4
5
6
7
 runs:
-  using: 'docker'
-  image: 'Dockerfile'
+  using: 'composite'
+  steps:
+    - run: ${{github.action_path}}/entrypoint.sh "${{inputs.generate_option}}" "${{inputs.ssh_key}}" "${{inputs.known_hosts}}" "${{inputs.git_user_email}}" "${{inputs.git_user_name}}" "${{inputs.deploy_option}}"
+      shell: bash

のようにしてusingdockerからcompositeに、stepsを追加してスクリプトを直接走らせます。

ここで、${{github.action_path}}がこのアクションをチェックアウトした場所へのパスになっています。 entrypoint.shはレポジトリトップに置いてあるため上の様な指定。

その後でinputsの値を引数で渡しています。

Dockerの場合には、シェルスクリプトの中で、

  • $INPUT_SSH_KEY

の様な感じで、INPUT_XXX(XXXはもとの名前の大文字版)という環境変数が設定され、 それを直接使えましたが、 Compositeでrunする場合にはこれらは有効では無いようでうまくいきませんでした。

なので、上の様に一つ一つ渡して中で受け取って使っています。

steps.runには必ずshellの設定が必要で、ここではシェルスクリプトを走らせるだけなのでbashを指定しています。

あとはシェルスクリプトの中でこれらの変数の扱いと、sshの設定をするところでパスが違うので そこを直しただけです。

これでアクション側は変更完了で、変更後のcommitでv2v2.0.0タグを新たに作っておきます。

ブログのレポジトリ側でバージョンの変更と、必要なツールを入れます。 もともとDockerではRubyのImageを入れていたので、全体にRubyを入れ、 また問題のもとっぽいPythonも入れておきます。

action.yml
1
2
3
4
5
6
7
8
9
10
-    - uses: rcmdnk/octopress-action@v1
+    - uses: actions/setup-python@v2
+      with:
+        python-version: '3.x'
+        architecture: 'x64'
+    - uses: ruby/setup-ruby@v1
+      with:
+        ruby-version: 2.7
+        bundler-cache: true
+    - uses: rcmdnk/octopress-action@v2

Pythonも3.xではなくマイナーバージョンもfixしても良さそうですがとりあえずはこれで。

Rubyのバージョンは逆にもっと新しくても良さそうですが、以前のが2.7を使っていたのでとりあえずそれで。

octopress-actionv1からv2にします。

とりあえずこれで再び動く様になりました。

Composite便利

自作アクション作るのに、環境の設定だとJavaScriptを使わざるをえず面倒だな、 と思ってDockerを使ったりもしてましたが、 Compositeで直接スクリプトとかを動かせるととても楽です。

Sponsored Links
Sponsored Links

« M1 macでIntelな環境のシェルを使ったCronジョブを流したりする Evernoteのショートカットキーの変更 »

}