GitLab CIの設定をミスって~1kのゴミブランチを生成してしまったのでそれを消した123

基本

$ git branch -r
$ git push --delete origin <branch>

問題点

~1kのブランチを手動でやるのはしんどい。 Juliaの

  1. glueとしてCmdが使いやすい
  2. async系がある

を活用したsolutionで対処した。

もう一つ、たくさん同時にやるとなんかssh-agent(自分はgpg agentを使ってる)関連でエラーが起きそうな感じ。 10個同時は行ける。

最終形態

using ProgressMeter
branches = read(open(`git branch -r`), String) |> split |> filter(contains("compathelper/")) .|> (s -> match(r"origin/(.*)$", s) |> first)
p = Progress(length(branches))
runnings = Channel{Bool}(10)
map(branches) do branch
    @async begin
        put!(runnings, true)
        run(`git push --delete origin $branch`)
        take!(runnings)
        next!(p)
    end
end .|> wait

プログレスバーとgitのログが混ざってて荒削り感あるけど、これ割といい感じと思う。 一応解説するとChannelに数が決まってて、put!take!でブロックしつつ、実行中のjobはChannelにものを置くことで最大10個走らせてる。 途中でエラーが起こると残りすべてのwaitが無意味になるので、errormonitorとか使ったほうが良かった気がする。 あとrunningsにゴミも溜まりそう。

結局試行錯誤で(大量の失敗をしつつ)そこそこの数のブランチを消してたので、本番では490個を5分ほどで消せてた。

あとがき

割と見られるリポジトリでやらかしてしまって恥ずかしい。 merge request作る人は!1xxxなものを見ることになる。 CIは理解して書こうになった4。 あと今日中にリリースしようかなと思ってたけどまともなCIも走らなくなったので一旦お預け。 これリミットいつ解除されるのかな…


  1. merge requestは?: 手動で20個ずつ消した ↩︎

  2. 何をやらかした?: CompatHelperをhttps://juliaregistries.github.io/CompatHelper.jl/stable/の通りに設定したら無限に走った。 ↩︎

  3. どうやって止めた?: 最初は手動でmerge request閉じればjobがcancelされて止まるだろうと思ったが、大量のpendingがすでにいたので意味がなかった。pipelineを止めるのも時間がかかった。途中でgitlab-ci.yml書き換えればいいじゃんと思ったけど、すでに大量のpendingがいた。設定で止められないかちょっと見た感じわからなかった。最終的にlimit rateに達して止まった。 ↩︎

  4. git+なものでGitHubやGitLabやその他もろもろ違っててめんどい。でも便利なのは確か。 ↩︎