actions-chiritoriで削除マーカーを運用して期間限定のソースコードを管理する

先日リリースした Chiritori v1.4.0 のリリースで、削除マーカーのリストをJSONで取得できるようになりました。 これを利用し、actions-chiritoriでPull Requestの差分に含まれる削除マーカにアノテーションを付与できるようになりました(たとえばこのように)。

これにより、GitHub Actionsを活用して、開発フローに削除マーカーの運用を組み込みやすくなりました。 たとえばキャンペーンのような時限的なコンテンツの管理や、リリース後の機能に関するFeature Flag周辺のソースコード削除に役立つかもしれません。

ということで、あらためてactions-chiritoriの使用例を紹介します。

削除マーカーを含むPull Requestを作成する

将来的に不要になるであろうソースコードに削除マーカーを記述します。

/* <removal-marker name="Feature1"> */
const isFeatureReleased = await fetchFeatureFlag('Feature1');
/* </removal-marker> */

/* <removal-marker name="Feature1" unwrap-block> */
if (isFeatureReleased) {
  const feature1 = new Feature1();
  feature1.run();
}
/* </removal-marker> */

これは、Chiritoriでは以下のように削除できます。

$ cat /path/to/index.js | chiritori --delimiter-start="/* <" --delimiter-end="> */" --removal-marker-target-name="Feature1"

削除すると以下のようになります。

const feature1 = new Feature1();
feature1.run();

このような差分を含むPull Requestを作成したとき、正しく削除マーカーを記述できていることを検査したくなると思います。 actions-chiritoriを用いて以下のようなGitHub Actions Worlflowを記述します。

name: Annotate removal-marker in pull request diff

on: pull_request

jobs:
  remove-time-limited:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.base_ref }}

      - run: echo BASE_SHA=`git rev-parse HEAD` >> $GITHUB_ENV

      - uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - uses: piyoppi/actions-chiritori@v2
        with:
          filepattern: '*.js'             # リポジトリ内を検索するファイルパターンを記述
          delimiter-start: "/* <"         # chiritoriコマンドの `delimiter-start` 引数に設定する値を記述
          delimiter-end: "> */"           # chiritoriコマンドの `delimiter-end` 引数に設定する値を記述
          run-mode: "list-all"            # 削除予定のものも含むすべての削除マーカーをリストアップ
          target-file-mode: "diff"        # Pull Requestに含まれる差分のみ検査
          report-mode: "annotation"       # 差分にアノテーションをつける
          base-sha: ${{ env.BASE_SHA }}   # 比較対象のSHA

このようにすると、Pull Request上の差分のみを対象に、削除マーカーの部分をアノテーションで示します。 (たとえば https://github.com/piyoppi/actions-sandbox/pull/8/files のようになります)

ソースコードに対して都度Chiritoriを動作させなくてもレビューが可能になります。

削除マーカーでマークしたソースコードを取り除く

削除マーカーでマークしたソースコードを取り除くための例として、リリース済のFeatureの名称をパラメータにとる workflow_dispatch ワークフローを以下に示します。 機能をリリースしたあとにこのワークフローを手動実行することで、リポジトリ内の .js ファイルを対象に、 removal-marker 削除マーカーおよび、期日を迎えた time-limited 削除マーカーを削除します。

name: Release-triggered removal of source code

on:
  workflow_dispatch:
    inputs:
      feature:
        description: Released feature name
        required: true
        type: string

env:
  BRANCH_NAME: removal-marker-${{ github.sha }}
  FILE_PATTERN: '*.js'

jobs:
  remove-time-limited:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - run: echo ${{ inputs.feature }} > feature.txt   # パラメータに指定された機能名をコンフィグとしてテキストファイルに書き出す

      - uses: piyoppi/actions-chiritori@v2
        with:
          filepattern: ${{ env.FILE_PATTERN }}          # リポジトリ内を検索するファイルパターンを記述
          delimiter-start: "/* <"                       # chiritoriコマンドの `delimiter-start` 引数に設定する値を記述
          delimiter-end: "> */"                         # chiritoriコマンドの `delimiter-end` 引数に設定する値を記述
          removal-marker-target-config: "feature.txt"   # chiritoriコマンドの `removal-marker-target-config` 引数に設定する値を記述

      - name: 'Commit diff'
        run: |
          git config --global user.email "chiritori-bot@example.com"
          git config --global user.name "chiritori-bot"
          git checkout -b ${{ env.BRANCH_NAME }}
          git add ${{ env.FILE_PATTERN }}
          git commit -m "Remove time-limited by chiritori"
          git push origin ${{ env.BRANCH_NAME }}

      - name: 'Create pull request'
        uses: actions/github-script@v7
        with:
          script: |
            await github.rest.pulls.create({
              owner: 'piyoppi',
              repo: 'actions-sandbox',
              title: 'Remove Release-triggered by chiritori',
              head: `${{ env.BRANCH_NAME }}`,
              base: 'main'
            });

(たとえば https://github.com/piyoppi/actions-sandbox/pull/7 のようになります)

今回はデモを簡単にするために、指定する機能名(workflow_dispatchfeature パラメータ)は一つにしていますが、 actions-chiritoriの removal-marker-target-config に指定するファイル(=feature.txt)は機能名を改行区切りで複数指定できます。

たとえば、お使いのFeature Flagサーバから既に利用されていない機能一覧を取得し、今回でいうところのfeature.txtを生成すれば、複数の機能削除の自動化もできるかもしれません。

まとめ

ChiritoriをGitHub Actionsに取り入れやすくなりました。開発マシンにChiritoriをインストールしなくても、削除マーカーを運用できるようになっています。

余談ですが、actions-chiritoriはシェルスクリプトで記述しているものの、機能が多くなってきているので他の言語で書き直してテストコードを書きやすくしたり、リファクタリングしていきたいですね...。 (gitコマンドから差分のある行を抽出するコードとか、結構たいへんでした)

ではでは。

クリックすると匿名でいいねできます。

(@piyoppi/counter-tools を使っています )