🔐

main ブランチの特定の文字列だけは絶対に死守したい

2024/02/18に公開

概要

  • github に置いているコードの中で、絶対に変えてはいけない、変えられたくない文字列ってありませんか?
  • PR のレビューで 100% 気付ければよいですが、漏れてしまう事も。。
  • そんな文字列を死守するために github actions を使用して仕組み化する記事です。

変更されてしまうと困る文字列

色んなケースがありますが、今回は下記を想定して進めます。

  • kustomize を使用して kubernetes を運用している
  • CD で kustomization.yaml の images を書き換えて ArogoCD でデプロイする
  • release ブランチは CD で更新され続けるが、main ブランチは DUMMY_TAG で固定しておきたい

[kubernetes/web/overlays/dev/kustomization.yaml]

resources:
  - ../../base

namespace: hoge

replicas:
- name: nginx
  count: 5

images:
  - name: nginx
    newName: nginx
    newTag: DUMMY_TAG

運用でカバーではなく、自動で防止する仕組みを作る

PR のレビューで気付ければよいのですが、レビュワーが変更してはいけない事を必ず覚えている、その認識があるとは限りません。本来のレビュー対象ではないわずかな修正は見落としがちです。こういった場合は自動で防ぐ仕組みを作るべきです。CI の一部に組み込んで意図せずに変更されたらテストを失敗にすれば漏れなく気付けます。

github actionsを作成

  1. 文字列の変更を検知するスクリプトを作成する
    簡単な処理なので自前で作成するものよいですが、GitHub Marketplace に無料のスクリプトがあるので今回は こちら を使用します。
    ※ 私が作ったものを再利用できるようにアップしています。

  2. main ブランチへのプッシュをトリガーにする workflow を作成します。
    1 のスクリプトを uses で使用しています。inputについては こちら を参照してください。

[.github/workflows/test.yaml]

on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4

      - name: string check
        uses: yokobot/string-changes-monitor@v0.1.2
        with:
          file: kubernetes/web/overlays/dev/kustomization.yaml
          line: 13
          string: "    newTag: DUMMY_TAG"
  1. main ブランチへ PR を作成して、 workflow を一度実行しておきます。

Branchの必須ステータスチェックを有効化

Github UI 上で、Settings -> Branches -> Branch protection rule で以下を編集します。

  • Branch name pattern: main
  • Require status checks to pass before merging にチェックを入れる
  • 検索窓に workflow のファイル名を入力して前手順で実行した workflow を選択する
  • Save Changes を忘れずに押下

設定はこれにて完了です。

動作確認

実際の動きを確認します。

  1. トピックブランチを作成して、github にプッシュする
  2. main ブランチに向けて PR を作成

PR の作成、更新時に文字列チェックが入るので見落とすことがなくなります。

最後に

ドキュメントや運用でカバーは出来るのですが、それでもミスは起きてしまいます。
仕組み化出来ることは仕組み化していきましょう!

参考した記事

GitHubで編集を提案

Discussion