🦁

renovateのない環境で諸々まとめてupgradeする

に公開

ものすごくコストセンシティブな局面で、わがままに最新バージョンを使いたい人向けです。

さて、最新バージョンをきっちり追っかけたいならrenovateを使えば良いです。
github.comにコードをホストしてるならGitHub ActionsでCIしていれば、test / lintを継続的に実行できます。
しかし、お金がない。ものすごくお金がない。
かつ、面倒を見てるコードはprivateリポジトリにある、そんなニッチな状況に置かれたあなたへの記事です。

aqua管理下のツールをupgradeする

開発に必要なツール群(formatter / linter / etc...)はaquaでinstallします。

aqua本体のupgradeは、以下の通り。

aqua upa

aqua.yaml記載のツールのupgradeは、以下の通りです。

aqua up

GitHub Actionsのactionをupgradeする

aqua i suzuki-shunsuke/pinact しておきます。

pinact run -u

↓commit ハッシュでバージョン固定される上、バージョン番号がコメントされるので安心です。

jobs:
  lint:
    name: textlint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

tflintプラグインをupgradeする

tflintコマンドでバージョンアップできると嬉しいのですが、残念ながらそんな機能はなさそう。ままならないものです。
シェル芸でどうにかします。
aqua i cli/cli して、ghコマンドをinstallしておきます。
以下は、Google Cloudプラグインのサンプルです。

latest_version=$(gh api \
    -H "Accept: application/vnd.github+json" \
    -H "X-GitHub-Api-Version: 2022-11-28" \
    /repos/terraform-linters/tflint-ruleset-google/releases/latest \
    --jq .tag_name | tr -d 'v')
gsed -i 's/version = "[0-9\.]*"/version = "'"$latest_version"'"/' .tflint.hcl

↓以下のversionの箇所を、GitHub.comの最新releaseのバージョンに書き換えます。

plugin "google" {
 enabled = true
 version = "0.33.0"
 source  = "github.com/terraform-linters/tflint-ruleset-google"
}

まとめて実行

では、↑をまとめて1コマンドで実行できるようにしましょう。
先ほどから申し上げている通り、お金がないのでCIをGitHub Actionsで行う余力がありません。
(GitHub Actionsの無償枠が余っているならもちろんCIに使ってOKです。
余ってないのでCDに使うことにしました。
安全にはコストをかけるべき、という判断)

ローカルでCIを行うためにlefthookを導入します。
aqua -i evilmartians/lefthookします。
lefthook自体はGit hook管理のツールなのですが、任意のスクリプトを実行することもできます。
https://github.com/evilmartians/lefthook#your-own-tasks

以下はPython + terraformプロジェクト用のサンプルです。
これで、lefthook run bumpで依存関係をまとめてupgradeできます。

pre-commit:
  parallel: true
  commands:
    tffmt:
      glob: "*.{tf,hcl}"
      run: terraform fmt -recursive
    tflint:
      glob: "*.{tf,hcl}"
      run: |
        config_path=$(PWD)/.tflint.hcl
        tflint --config "$config_path" --recursive --init
        tflint --config "$config_path" --recursive
    trivy:
      glob: "*.{tf,hcl}"
      run: |
        trivy fs --scanners secret,misconfig \
          --severity MEDIUM,HIGH,CRITICAL \
          --ignorefile ./.trivyignore \
          --exit-code 1 .
    typos:
      run: typos --config .typos.toml .
    actionlint:
      root: ".github/workflows"
      glob: "*.{yml,yaml}"
      run: actionlint
    yamlfmt:
      glob: "*.{yml,yaml}"
      run: yamlfmt -conf .yamlfmt.yml .
    ruff:
      glob: "*.py"
      run: |
        uv run ruff format
        uv run ruff check --fix
    pytest:
      glob: "*.py"
      run: uv run pytest --cov
bump:
  parallel: true
  commands:
    aqua:
      run: aqua upa && aqua up
    pinact:
      run: pinact run -u
    tflint:
      run: |
        latest_version=$(gh api \
          -H "Accept: application/vnd.github+json" \
          -H "X-GitHub-Api-Version: 2022-11-28" \
          /repos/terraform-linters/tflint-ruleset-google/releases/latest \
          --jq .tag_name | tr -d 'v')
        gsed -i 's/version = "[0-9\.]*"/version = "'"$latest_version"'"/' .tflint.hcl
    python:
      run: uv lock --upgrade && uv sync --upgrade

Discussion