GitHub Actions 奮闘中(README.mdにカバレッジのバッジを表示→できた) | あさぼんの3Dプリンタ奮闘記

あさぼんの3Dプリンタ奮闘記

40代のサラリーマンです。
3Dプリンタやプログラミングで苦労していることを書いていこうと思います。

GitHub でちょっとしたアプリを公開しています。

asabon/PFD_Editor (github.com)

 

引き続き、開発環境の整備を楽しんで(苦戦して)います。

プルリク発行時に、そのプルリクに対して自動で UnitTest を実行し、プルリクコメントにそのカバレッジを表示する、ところまではできるようになりました。こんな感じ。

テストを追加したので、以前よりカバレッジが上がってます。

(でもまだ 52.4% ・・・)

  • Windows アプリ部分でテストの書き方がわからない
という課題があります。これはひとまず置いておくとして・・・。
開発環境の整備、としては、以前も書きましたが、
  • トップページにカバレッジのバッジを張りたい
  • トップページに master ブランチのカバレッジを表示したい
  • リリースフローをできるだけ簡略化(自動化)したい
あたりです。
まず、バッジですが、こんなのです。
Report Generater 実行時に "-reporttypes:'Badges'" オプションによって生成されています。

なので、あとはこの「生成されたバッジ」を README.md に表示できれば OK です。

これを asabon/PFD_Editor (github.com) の「↓この辺(赤いところ)」に表示させたい。

で、どうするのか。

README.md から URL を指定して画像ファイルを表示することはできるので、とにかく、

  • ネットから参照できるところに画像をアップロードする
これしかない(はず)です。
じゃぁ、どこにアップロードしたらいいのか。
  • GitHub で開発した成果物に関する情報なので、GitHub に置きたい
なんですよね。
じゃぁ、GitHub のどこにアップしたらいいのか。
このあたりから自分の知識が足りなくて、適切な判断ができていないのかもしれないですが、
  • リポジトリの成果物に関する情報なんだから該当リポジトリ内に格納すべき
なのかな、と思っています。
(ほかに選択肢があるのかがわからない・・・)
じゃぁ、このリポジトリに置くとして、どのブランチに置くのがいいのか。
  • 本線 ( master ブランチ ) の成果物の情報なので master ブランチに置くべき
だと思っているのですが、これだと、以下のような2つの課題がありそうです。
  1. master ブランチへの push をトリガーにした CI 内で master ブランチに push したら、また CI が動き出してしまう。
  2. ブランチを保護する設定で master ブランチへの直接 push を禁止していたらできない
課題1についてはこんなイメージです。
  1. master ブランチに push(プルリクがマージされる)
  2. master ブランチへの push をトリガーに CI (テスト&カバレッジ計測) が動き始める 
  3. カバレッジ計測結果(バッジ)が master ブランチに push される
  4. 以降 "2." と "3." が延々と繰り返される
となってしまいそうです。
一応、 GitHub Actions では「指定されたパスに push された場合は動作しない」といった記述はできるようなので、回避できそうなのですが、課題2が残ります。
GitHub の public リポジトリとして公開しているので、知らない人に本線が壊されたりしないよう、プルリク無しの master ブランチへの直接 push は禁止する設定にしています。
 
じゃぁ、どうするのか。
  • 案)
    • 課題1は「指定されたパスにpushされた場合は動作しない」記述を使用して解決
    • 課題2は「GitHub CLI を使ってのプルリク発行~承認」により解決
という対応が考えられそうです。
ci.yml のイメージはこんな感じです。
  • 動作条件
    1. master ブランチに push されたときに動作
      • ただし badge ディレクトリのみの変更の場合は動作しない
    2. master ブランチにプルリクされたときに動作
  • 動作内容
    • UnitTest を実行しカバレッジレポート(&バッジ)を生成
    • 動作条件1に合致した場合
      • バッジを別ブランチ(例えば badge ブランチ)に push ★1
      • そのブランチを master ブランチにマージするためのプルリク発行 ★2
      • プルリクを承認 ★3
こんな感じでできればよさそうかな、と思います。
★2, ★3 は、ググって情報が見つけられたのでできそうな気がします。
★1 はまだ情報が見つけられていないので引き続き調べていこうと思います。
 
(30分後)
・・・と思ったらできました!
上記 ★1 について、調べてもなかなか見つからないなぁ・・・と思っていたのですが、
このブログを書いて自分の頭が整理できたからなのか、あっさりと検索でヒット。
 

      - name: Push to badges branch

        uses: s0/git-publish-subdir-action@master

        env:

          REPO: self

          BRANCH: badges

          FOLDER: badges

こんな感じの記述で、 "badges" ディレクトリ以下のファイルが "badges" ブランチに push されました。(名前がかぶってわかりにくい・・・)
 
こんな感じになりました。やった~!!
ここまでで出来上がった ci.yml は↓です。
 
同じようなことで困っている方のお役に立てたらうれしいです。