diff --git a/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-0.svg b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-0.svg new file mode 100644 index 0000000..a117369 --- /dev/null +++ b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-0.svg @@ -0,0 +1 @@ +第1回攻撃2/20hackerbot-clawアカウント作成2/27PR #10252送信・即クローズpull_request_target発火 → PAT盗取2/28盗んだPATで178リリース削除リポジトリPrivate化(32K+スター消滅)VSCode拡張(OpenVSX)を汚染 \ No newline at end of file diff --git a/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-1.svg b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-1.svg new file mode 100644 index 0000000..bf686ff --- /dev/null +++ b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-1.svg @@ -0,0 +1 @@ +recv.hackmoltrepeat.comaquasecurity/trivyGitHub Actions Runner攻撃者フォークrecv.hackmoltrepeat.comaquasecurity/trivyGitHub Actions Runner攻撃者フォークpull_request_target トリガー発火ベースリポジトリのシークレット権限で実行中翌日 03:47 UTC に行動攻撃者 hackerbot-claw悪意あるコードをコミットPR攻撃者フォークのコードをチェックアウト悪意あるスクリプト実行PAT(Personal Access Token)を送信・流出PAT受信完了盗んだPATで178リリースを全削除リポジトリをPrivate化Open VSX拡張に悪意あるファイルをプッシュ攻撃者 hackerbot-claw \ No newline at end of file diff --git a/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-2.svg b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-2.svg new file mode 100644 index 0000000..9f72801 --- /dev/null +++ b/public/images/blog/trivy-supply-chain-attack-2026-1/mermaid-2.svg @@ -0,0 +1 @@ +ランナー上の展開先イベントコンテキスト(展開可否の判定)push / scheduleworkflow_dispatchpull_request(フォーク)pull_request_targetステップ間でプロセス環境は非共有スクリプトが書き込みスクリプトが書き込み後続ステップから読み取り可能シークレット格納レイヤーOrganization Secrets(暗号化保存)Repository Secrets(暗号化保存)Environment Secrets(暗号化保存 +承認ルール)on: イベント種別シークレット展開を許可シークレット展開を拒否Workflow level env:Job level env:Step level env:(プロセス環境変数)run: 内の式展開(シェルスクリプトに直接埋込)共有ファイルシステム$GITHUB_WORKSPACE //tmp \ No newline at end of file diff --git a/src/content/blog/gh-action-concurrency.md b/src/content/blog/gh-action-concurrency.md new file mode 100644 index 0000000..3650841 --- /dev/null +++ b/src/content/blog/gh-action-concurrency.md @@ -0,0 +1,245 @@ +--- +title: GitHub Actions "concurrency" とは +pubDate: '2026-09-06' +description: GitHubとGitlabのCIのキャンセル処理についてまとめた +author: RiiiM +tags: [Tech,CI/CD] +--- +## CI安定化 + +最近、RowicyのCIを少し安定させるための修正を行った + +[https://github.com/rowicy/web/pull/191](https://github.com/rowicy/web/pull/191) + +pnpmのバージョンを固定し、pnpm installを`--frozen-lockfile`するのが目的 + +付加的に、concurrencyを追加した + +```yaml +# .github/workflows/test.yml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +... +``` + +concurrencyとはなんだろか + +## concurrencyとは + +GitHub Actionsでは、同じブランチへの複数pushするとCIインスタンスはその度に起動し、各々のタイミングで開始し完了まで走る + +しかしlintやテストは最新コミットのCI結果を見れば十分で +古いJobを完了まで走らせるよりはキャンセルしちゃったほうがいい + +``` +Job ───────× + ↑ + │ + │ +Job ▶ ───────────────────── +``` + +これにはconcurrencyキーが使える + +```yaml +concurrency: + group: test + cancel-in-progress: true +``` + +## groupの指定 + +並行制御グループをつくる + +```yaml +concurrency: + group: hoge +``` + +と書けば、これがグルーピング指定 + +名前は何でもいい + +しかしこうすると、Jobはすべてhogeグループになる +コミット先ブランチ、ワークフロー関係なく + +なので変数でわける + +```yaml +name: 'Test' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +``` + +これでTestワークフローなら`Test-refs/heads/`というgroup名になり +他ブランチのCIがJobをキャンセルすることはない + +## cancel-in-progress + +キャンセル制御をグループと合わせて宣言 + +グループ内で新しいJobがきたら、今走っているJobはどうするかを宣言 + +`cancel-in-progress: true` + +``` +Job ───────× + ↑ + │ + │ +Job ▶ ───────────────────── ✓ +``` + +`cancel-in-progress: false` + +``` +Job ──────────────── ✓ + ↑ + │ + │ +Job ----wait--- ▶ ───────────────────── ✓ +``` + +| 設定 | 挙動 | ユースケース | 例 | +| --------------------------- | -------------- | ---------------- | --------------------------------------- | +| `cancel-in-progress: true` | 中断 | 最新のコミットのみ実行でいい | - PR 毎のテスト
- lint / 単体テスト
- ビルド確認 | +| `cancel-in-progress: false` | 中断せずに、新しい実行を待機 | 途中でキャンセルされると困る | - 本番デプロイ
- データ移行ジョブ
- 夜間バッチ処理 | + + + +## 待機は1件のみ + +`cancel-in-progress: false`のとき +待機できるのは最新の1件のみ + +ここで`queue: max`つけると最大100件まで待機させられる + +```yaml +concurrency: + group: deploy + cancel-in-progress: false + queue: max +``` + +今回は必要がなかったのでつけてない + +## WorkflowにもJobにも設定できる + +GitHub ActionsではWorkflowにJobが含まれる + +```txt "Workflow" "" +Workflow +└── jobs + └── + ├── runs-on + └── steps +``` + +並行制御のグルーピングはWorkflow単位とJob単位でできる +`concurrency`の階層を変えるだけ + +- Workflow + +```yaml +name: 'Test' + +concurrency: + group: hoge + cancel-in-progress: true + +jobs: + ... +``` + +- Job + +```yaml +name: 'Test' +... + +jobs: + test: + concurrency: + group: hoge + cancel-in-progress: true +``` + +## GitLab CI + +GitLab CIにも同様のキャンセル機能があるが少し制御が異なる + +```yaml "interruptible: true" "on_new_commit: interruptible" +# .gitlab-ci.yml +workflow: + auto_cancel: + on_new_commit: interruptible #キャンセル判断をワークフローで指定 + +stages: + - test + +unit_test: + interruptible: true # 割り込みOK + stage: test + script: + - npm run test + +integration_test: + interruptible: true # 割り込みOK + stage: test + script: + - npm run test:e2e +``` + +Githubとちがい、ワークフローレベルでワークフローのキャンセル判断を指定 +Job側でキャンセル可否を宣言する + +キャンセル判断とは`on_new_commit`の値だが以下が指定できる + + +| 設定値 | 動作 | 主なユースケース | +| ------------- | --------------------------- | -------------- | +| interruptible | 割り込み可能OKと言ってるJobあったらキャンセルして | テストやビルドは途中で止める | +| conservative | 割り込み可能NGのJobあったら最後まで完了させて | 不整合を極力避けたい | +| none | キャンセル判断なし | 無設定と同じ | + + +これに対してJob側で`interruptible`を指定 +キャンセルされて構わないかどうかを指示する + +ここで`conservative`を指定するとGitHubの `cancel-in-progress: false` のように待機列に入るかというとそうではない +Jobはキャンセルされず完了まで各々走るだけ +`on_new_commit`の指示に待機列は関係ない + +### resource_group + +Jobの同時実行数制御は`resource_group`で行う + +```yaml +deploy_production: + stage: deploy + script: + - ./deploy.sh + resource_group: production +``` + +resource_groupが同じJobは直列に実行される +deploy_productionジョブが複数発生しても順番に実行される + +Githubは並行制御用グルーピングだったが、Gitlabは直列実行用グルーピングであることに注意 +キューと同等 + +### GithubとGitlabのJob制御の違い + +GitHubとGitLabでは並行制御とグルーピングの考え方が違う + +GitHubは**Workflow, Job単位でグルーピング、そこでキャンセルか、直列実行** + +GitLabは**Workflowでキャンセル判断を示すがキャンセルの意思表示はJob側で** 直列実行はまた別でJob側でグルーピング指定 + + +こんな感じに分けられる + + diff --git a/src/content/blog/mitmproxy-doc-read-01.md b/src/content/blog/mitmproxy-doc-read-01.md index 77ca77e..6e7a9b5 100644 --- a/src/content/blog/mitmproxy-doc-read-01.md +++ b/src/content/blog/mitmproxy-doc-read-01.md @@ -3,7 +3,7 @@ title: 【ドキュメントを追え! mitmproxy編】 第1話 いかにして pubDate: '2025-05-20' description: mitmproxyのドキュメントを読んで自分で調べた補足をまとめました author: RiiiM -tags: [Tech, proxy, Document, mitmproxy] +tags: [Tech, Document] --- ![thumbnail](/images/blog/mitmproxy-doc-read-01/e0e639e4-611f-d1cf-d448-9ca64d23c13c.png) diff --git a/src/content/blog/n-command.md b/src/content/blog/n-command.md index 259669c..7d72f89 100644 --- a/src/content/blog/n-command.md +++ b/src/content/blog/n-command.md @@ -3,7 +3,7 @@ title: Node.jsバージョン管理 n コマンドについて pubDate: '2024-07-30' description: Node.jsを簡単に管理できるツールnコマンドを紹介します。 author: RiiiM -tags: [Tech, Node.js] +tags: [Tech] --- ## Node.js管理してますか? diff --git a/src/content/blog/trivy-supply-chain-attack-2026-1.md b/src/content/blog/trivy-supply-chain-attack-2026-1.md index 51e62e9..7475c0b 100644 --- a/src/content/blog/trivy-supply-chain-attack-2026-1.md +++ b/src/content/blog/trivy-supply-chain-attack-2026-1.md @@ -3,7 +3,7 @@ title: Trivyリポジトリ侵害(第1回)とGitHub Actionsのシークレット pubDate: '2026-03-29' description: 2026年2月のTrivy第1回侵害を振り返り、pull_request_targetの危険性、GitHub Actionsのシークレット展開レイヤー、GitLab CI/CDとの設計差を解説する author: RiiiM -tags: [Tech, Security, SupplyChain, Trivy, Vul, CI/CD, GitHubActions] +tags: [Tech, Security, CI/CD] --- ## はじめに diff --git a/src/content/blog/vulmemo-aws-codebuild-misconfig.md b/src/content/blog/vulmemo-aws-codebuild-misconfig.md index 7f9d885..a290db7 100644 --- a/src/content/blog/vulmemo-aws-codebuild-misconfig.md +++ b/src/content/blog/vulmemo-aws-codebuild-misconfig.md @@ -3,7 +3,7 @@ title: 【Vul】CodeBuildの設定ミスによるフィルタバイパス pubDate: '2026-01-16' description: AWS CodeBuildにおける設定ミスにより、AWS提供のGitHubリポジトリがサプライチェーン攻撃のリスクにあった件 author: RiiiM -tags: [Tech, Vul] +tags: [Tech, Security] --- 今回はこちらの記事から