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_dispatch
の feature
パラメータ)は一つにしていますが、
actions-chiritoriの removal-marker-target-config
に指定するファイル(=feature.txt)は機能名を改行区切りで複数指定できます。
たとえば、お使いのFeature Flagサーバから既に利用されていない機能一覧を取得し、今回でいうところのfeature.txtを生成すれば、複数の機能削除の自動化もできるかもしれません。
まとめ
ChiritoriをGitHub Actionsに取り入れやすくなりました。開発マシンにChiritoriをインストールしなくても、削除マーカーを運用できるようになっています。
余談ですが、actions-chiritoriはシェルスクリプトで記述しているものの、機能が多くなってきているので他の言語で書き直してテストコードを書きやすくしたり、リファクタリングしていきたいですね...。 (gitコマンドから差分のある行を抽出するコードとか、結構たいへんでした)
ではでは。
クリックすると匿名でいいねできます。
(@piyoppi/counter-tools を使っています )