背景
App engineでデプロイしまくると、古いバージョンのサービスが乱立して料金がかかる。なのでデプロイするたびに古いバージョンを削除すると理想的だ。
手法
shellで書いたりpythonクライアントを書いたりすればかけるが、shellは柔軟性に乏しく配列とかが書きづらい。pythonは柔軟だが、shellほど簡単にはかけない。
そこで、2021年5月にリリースされたzxを用いて書く。これによりjavascriptのPromise等を使い、柔軟にshellが書ける。
コード
deploy.mjs
#!/usr/bin/env zx
// 最初にデプロイする
await $`gcloud app deploy --quiet --project=XXX`
// 次に最新のデプロイ以外をすべて削除する
let versions = await $`gcloud app versions list --project=XXX | sed 's/ */:/g' | cut -f 2 -d : | tail -n +2 | ghead -n -1`
console.log("---")
versions = versions.toString().split("\n") // makes array
versions.pop() // removes last blank element created by new line
console.log(versions)
await Promise.all(versions.map(version =>
$`gcloud app versions delete ${version} --project=XXX`
))
console.log("done!")
実行方法(Mac)
chmod +x deploy.mjs
./deploy.mjs