Productivity Weekly記事でmainブランチへのマージ後に簡単にpublished: trueにしたい
mainブランチへのマージ後に簡単にpublished: trueにしたい
github連携での記事はmainブランチに存在しないとZenn上で確認できない。
mainブランチに追加していくスタイルなら解決できるが、コミットログを汚したくないので基本的にプルリクで追加していきたい
mainブランチに追加後にZenn上で確認したらpublished: false
からpublished: true
にする必要がある。いちいち変更してまたコミットするのめんどい。
GitHub Actionsで一連の作業を自動化するとそこら辺楽になる。
まずはどのイベントで発動させるかを考えてみる
とりあえず思いついた方法
- 手動で
workflow_dispatch
を動かしpublished: true
のコミットを積む
https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - プルリクへのコメント時(
issue_comment
)にpublished: true
のコミットを積む
https://docs.github.com/en/actions/reference/events-that-trigger-workflows#issue_comment - mainブランチへのマージ時に
published: true
とするプルリクエストを作成
https://qiita.com/okazy/items/7ab46f2c20ec341a2836
なんにせよpublished: false
をpublished: true
にするプログラムを作らないといけない。
せっかくだからGitHub Actionにしようか
これを見ながら作っていく
zennのmetadataはyaml front matter形式で書く
それを読み込むnpmパッケージを使うと楽そう
metadataを書き換えるためのActionのリポジトリ
多分完成した。
korosuke613/zenn-articlesに導入して早速Zennの記事を書いてみる
git commit時に変更がないとアクションが落ちてしまう · Issue #42 · korosuke613/zenn-metadata-updater-action
これなんとかする
pushChange()をする前にworking treeがcleanかどうか確認するようにする
describe("isWorkingTreeClean", () => {
test("Working tree is clean", async () => {
const actual = await isWorkingTreeClean();
expect(actual).toEqual(true);
});
test("Working tree is dirty", async () => {
await exec("touch", [".dirty"]);
const actual = await isWorkingTreeClean();
expect(actual).toEqual(false);
await exec("rm", ["-f", "./.dirty"]);
});
});
こういうテストがある時、ローカルでは実行したくない。(gitのツリーが汚れるため通らない)
describe("isWorkingTreeClean", () => {
const testIf = (condition: boolean) => (condition ? test : test.skip);
const onGitHubActions = process.env.CI === "true";
testIf(onGitHubActions)("Working tree is clean", async () => {
const actual = await isWorkingTreeClean();
expect(actual).toEqual(true);
});
testIf(onGitHubActions)("Working tree is dirty", async () => {
await exec("touch", [".dirty"]);
const actual = await isWorkingTreeClean();
expect(actual).toEqual(false);
await exec("rm", ["-f", "./.dirty"]);
});
});
なので、こういう風にすればテストをスキップできる。(参考)
GitHub ActionsはCI
(常にtrue
)という環境変数を持っているため、const onGitHubActions = process.env.CI === "true";
でGitHub Actions上で動いているかどうかが確認できる
E2Eテストめんどすぎるからテスト用リポジトリ作った