私が歌川です

@utgwkk が書いている

GitHub Actionsでテスト落ちた & 別のstepのoutputがtrue のときだけ走るstepを定義する

GitHub Actionsでテスト落ちた & 別のstepのoutputがtrue のときだけ走るstepを定義しようとしたけどできなかった - 私が歌川です の続きです。表題のようなworkflowを書こうとして結局やり方が分からなかったので、フォーラムに投稿したところ、回答をいただけました。

github.community

if: failure() && (steps.foo.outputs.exists == 'true') のように条件を指定すればよい、とのことです。確かにこの方法で実現できました。 前回の記事にあったworkflow YAMLを修正すると以下のようになります。

name: test
on:
  push:

jobs:
  test:
    name: annotate
    runs-on: ubuntu-latest
    steps:
      # 実際のテストの代わりに、ファイルを出力して non-zero status を返している
      - id: do_test
        run: |
          echo hello > hello.txt
          false

      - id: foo
        run: |
          if [ -e 'hello.txt' ]; then
            echo "::set-output name=exists::true"
          fi
        if: failure()

      - name: check steps.foo.outputs.exists
        run: echo ${{ steps.foo.outputs.exists }}
        if: always()

      - uses: actions/upload-artifact@v2
        with:
          name: hello
          path: hello.txt
        if: failure() && (steps.foo.outputs.exists == 'true')

failure() とか always() がない場合、そもそも条件式が評価されないみたいです。ということは、逆に failure() などは評価規則がちょっと変わってくる?

追記

If your if expression does not contain any of the status functions it will automatically result with success(). Context and expression syntax for GitHub Actions - GitHub Docs

ドキュメントに書いてありました。やはり failure()always() が含まれない場合、自動的に if: success() && ... だと解釈されるようです。

『[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識』を読んだ

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

  • 作者:武内 覚
  • 発売日: 2018/02/23
  • メディア: 単行本(ソフトカバー)

読みおわった。

なんとなくコマンド叩いてそれっぽいことが分かる、ぐらいの曖昧な理解の状態から少し進歩できたと思う。 プロセスの一生や、メモリ確保のしくみのほかに、愚直にやるとこういう問題があるので実際にはこのようなことが行われています、というのが実験データとともに示されているのがよかった。

ほんとうは実機で再現しつつ読み解いたほうがいいと思うけど、実機を用意するのが億劫だった。

GitHub Actionsでテスト落ちた & 別のstepのoutputがtrue のときだけ走るstepを定義しようとしたけどできなかった

特定のテストが落ちたとき、診断情報ファイルをdumpする。後のstepで、そのファイルが存在する場合はoutputにフラグを記録して、フラグが立っているときは最後にupload artifactする。

以下のようなYAMLを書いたらできるかと思ったけどできなかった。最後のupload artifactがスキップされてしまう。

f:id:utgwkk:20200515215430p:plain

name: test
on:
  push:

jobs:
  test:
    name: annotate
    runs-on: ubuntu-latest
    steps:
      # 実際のテストの代わりに、ファイルを出力して non-zero status を返している
      - id: do_test
        run: |
          echo hello > hello.txt
          false

      - id: foo
        run: |
          if [ -e 'hello.txt' ]; then
            echo "::set-output name=exists::true"
          fi
        if: failure()

      - name: check steps.foo.outputs.exists
        run: echo ${{ steps.foo.outputs.exists }}
        if: always()

      - uses: actions/upload-artifact@v2
        with:
          name: hello
          path: hello.txt
        if: steps.foo.outputs.exists

いい解決策を思いつかなかったのでフォーラムに投稿した。誰か知見あったら教えてください。

github.community

ぜんぜん眠れなくて、夜中3時ぐらいまで目が覚めててやばい!! となっていた。目を開けたら4時過ぎになっていてそのままぼうっとしていたら朝になっていた。めちゃくちゃだるいみたいなことはなくふつうに活動できたのだけれど、眠れないという感覚があると、実際に身体が休まったかどうかと関係なく、ややつらい気持ちになる。

今日も眠れない予感がする。

GitHub Actionsで落ちたテストをアノテーションするpytestプラグインを書いた

表題のものを書きました。

pypi.org *1

workflow内でおもむろに pip install pytest-github-actions-annotate-failures してから使うとアノテーションされる、という寸法になっています。

f:id:utgwkk:20200509025547p:plain

pytestは簡単にプラグインを書けるのがいいですね。初めて書いたけど、フックできる関数TestReportの定義を適宜参照したら書けました*2

仕組みとしては、 pytest_runtest_logreport をフックして、落ちたテストの行数とファイルパスを取得しつつworkflow commandを発行するだけです。40行ぐらいで書けててシンプルになっています。 テスト失敗時の出力を、改行をエスケープすることでいい感じにアノテーションしています。

ご活用ください。

github.com

*1:名前がけっこう長い

*2:逆に言うと、ドキュメントを読むより実コードを読んだほうが書き方は分かりやすくて、それはそれでどうなのという感じはする

GitHub Actionsのworkflow commandでアノテーションするときのmessageで改行したい

GitHub Actionsのworkflow commandという機能を使って、workflowの中からリポジトリのファイルの特定の行に対してアノテーションを付けることができる。CIが落ちたときのスタックトレースやexpected, actualなど表示できて便利。

スタックトレースを出すときは当然複数行で表示したいと思う。こういうときに、

echo "::error file=test.txt,line=2::hoge\nfuga\npiyo\nuooo"

のように直接改行文字を入れても、messageには hoge しか入らない。

f:id:utgwkk:20200507185840p:plain

改行するには、改行文字をURLエンコードすればよい。たとえば \n%0A にすると改行できる。

echo "::error file=test.txt,line=2::hoge%0Afuga%0Apiyo%0Auooo"

f:id:utgwkk:20200507190004p:plain

GitHub Actionsのドキュメントを探してもうまく見つけられなかったけど、なんで分かったのかというと、@actions/coreにそういう変換をしてるコードがあったから。JS (TS) を使うworkflowからだと @actions/core を使えばよいと思うけど、JSじゃないときはこういう変換を自分でやっていく必要がある?


副産物として、workflow commandで改行できることをテストするリポジトリができた。

github.com

追記

このあたりでURLエスケープを解釈してそうだなというのが分かった。パーセントエンコーディングを完全にデコードしているわけではなくて、ほんとうに改行する用とかに使っていそう?

runner/ActionCommandManager.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub

runner/ActionCommand.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub

runner/ActionCommand.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub

5年ぶんのゴールデンウィークを振り返る

ゆっくりしてたらゴールデンウィークが終わってしまい、特筆すべきことがないので一気に5年ぶんのGWを振り返る。

2020

風来のシレン(SFC・新品)を買った。プレイする環境はない。

不思議のダンジョン2 風来のシレン

不思議のダンジョン2 風来のシレン

  • 発売日: 1995/12/01
  • メディア: Video Game

2019

2019年のGWといえば、平成が終わり令和が始まる瞬間。DEN-ENとEL LATINOで平成最後の花金をやって、部員たちと鴨川できららジャンプをやった。

2018

西成に行ってた。

2017

EL LATINOに行ったり、動物園に行ったりしてた。ブログに記録が残っててわかりやすい。

utgwkk.hateblo.jp

utgwkk.hateblo.jp

2016

京アニショップやけいおんの聖地に行ってた。アルバイトやめてお金がなくなっていたらしい。

utgwkk.hateblo.jp

utgwkk.hateblo.jp