つばくろぐ @takamii228

知は力なり

JenkinsのMultibranch PipelineでGitLab PluginのaddGitLabMRCommentが動かない

はじめに

tag pushに続いて、Jenkins Multibranch Pipeline + GitLab Pluginネタです。

takamii.hatenablog.com

GitLabプラグインDSLの中にaddGitLabMRCommentとあったので、Merge RequestのCIの結果をJenkinsからGitLabにコメント連携できるやんけ、と思って設定してみました。

https://jenkins.io/doc/pipeline/steps/gitlab-plugin/#addgitlabmrcomment-add-comment-on-gitlab-merge-request

動かない。

JenkinsfileのDeclarativeのpostの中でsuccessとfailureそれぞれにaddGitLabMRCommentを追加してみましたが動きません。

pipeline {
    agent any

    post {
        success {
            updateGitlabCommitStatus name: 'build', state: 'success'
            updateGitlabCommitStatus name: 'test', state: 'success'
            mattermostSend color: "good", message: ":smile: [${env.JOB_NAME}](${env.BUILD_URL}) のビルドに成功しました"
            addGitLabMRComment comment: ":smile: [${env.JOB_NAME}](${env.BUILD_URL}) のビルドに成功しました" //追記
        }
        failure {
            updateGitlabCommitStatus name: 'build', state: 'failed'
            updateGitlabCommitStatus name: 'test', state: 'failed'
            mattermostSend color: "danger", message: ":dizzy_face: [${env.JOB_NAME}](${env.BUILD_URL}) のビルドに失敗しました"
            addGitLabMRComment comment: ":dizzy_face: [${env.JOB_NAME}](${env.BUILD_URL}) のビルドに失敗しました" //追記
        }
    }
....

JenkinsとGitLabの連携方法はこちらをご覧ください↓

qiita.com

Issueが上がってた

あれれーと思って調べていたらIssueが上がっていた。

github.com

bugとなっていて、結びに以下のコメントが。

I think that's because this is a Multibranch Pipeline job. For those, MR hooks won't trigger.

どうやらMerge Requestのhookイベントがうまく連携できていない模様。

Multibranch PipelineがMerge Requestのフックがうまくうけとれないっぽい。

よく見たらREADMEに書いてあった

Multibranch Pipelineと相性悪いんかなと思ってREADME読んでたら書いてあるやんけ・・・。

Due to this, the plugin just listens for GitLab Push Hooks for multibranch pipeline jobs; merge Request hooks are ignored.

github.com

IntegrationのところでTestしたら409が返ってきた。

stackoverflow.com

ちーん。

GitLabつらいのでGHEつかいたい。

JenkinsのMultibranch PipelineではGitLabのtag pushビルドが走らない

Multibranch PipelineでTagが拾えるようになったらしい

Multibranch PipelineジョブのJenkinsfileの中で、when句にtagが使えるらしい。

jenkins.io

これを使えばレポジトリへのtag Pushを契機にリリース資材をライブラリに追加したりS3に配置したりなんてことが可能になる!と思ったので試してみました。

GitLabでは自動実行されなかった

GitLabとJenkinsの連携手順は以下を参照。

Webhookの発行のところのTriggerのTag Pushにチェックを入れればGitLabからJenkinsへWebhookが飛ぶようになります。

qiita.com

実際にtag pushしてみましたが、Git PluginがTagに対応しているので、Tagに応じてジョブをdiscoverするものの自動実行されませんでした。

ログを見る限りWebhookは飛んでいるもののJenkinsがうまく受け取れていないようです。

GitLabプラグインの中を見てみる

README.mdにtag pushについては以下のことしか書いてなかった。

In order to build when a new tag is pushed:
1. In the GitLab webhook configuration, add 'Tag push events'
2. In the job configuration under 'Source code management':
i. Select 'Advanced...' and add '+refs/tags/:refs/remotes/origin/tags/' as the Refspec
ii. You can also use 'Branch Specifier' to specify which tag need to be built (example 'refs/tags/${TAGNAME}')

これはフリースタイルでジョブを作ったときの設定で、Multibranchに対する記述はありません。

github.com

ソースコードを読んでみても、TagPushTreggerに関するコードは見当たらなかったので実装がないっぽい。

gitlab-plugin/GitLabPushTrigger.java at master · jenkinsci/gitlab-plugin · GitHub

...
    private boolean triggerOnPush = true;
    private boolean triggerOnMergeRequest = true;
    private boolean triggerOnPipelineEvent = false;
    private boolean triggerOnAcceptedMergeRequest = false;
    private boolean triggerOnClosedMergeRequest = false;
    private boolean triggerOnApprovedMergeRequest = false;
...

他にも困っている人がいた

ググると騒いでいる人々を発見。やはりできないっぽい。

回避方法

仕方ないのでブランチPushでブランチ名からtag名を取得して、Jenkinsfile内部でtagをレポジトリへpushするように設定した。

やり方はこちらを参考にした。

int128.hatenablog.com

GitLab APIGitHub APIは結構違う

ドキュメントを見るとGitLabとGitHubAPIのパラメータは構造もパラメータ名も結構違う。

世の中の大半はGitHubで動いてるっぽいので、GitLab勢にとっては世知辛い

GitLabのWebhookをGitHub API互換に変換する何かがあるとみんな幸せになったりするのだろうか🤔🤔🤔

Kubernetesでhelm deleteとhelmfile deleteを間違えて事故った話

はじめに

で起きたことを懺悔としてまとめます。

前談

今のプロジェクトで運用しているKubernetesクラスターはAWS上にkopsで構築しています。

また各chartをパッケージマネージャであるhelmで管理していて、chartの定義をhelmfileで管理しています。

github.com

Releaseを再作成しようとして実行するコマンドを間違えた

今回とあるServiceに対してKubernetesのserviceとdeploymentのyamlダッシュボードからいじった結果、helmfile syncに失敗する状態になってしまったので、 helm経由でReleseを作り直そうとしました。

私はまだKubernetesやhelmの操作に慣れていなかったため、誤ってhelmfile deltehelm deleteコマンドを間違えてしまいました。

# 本来打つべきコマンド
helm delete xxxxxx

# 実際に打ったコマンド
helmfile delete xxxxxx

helmコマンドではリンクの通り、RELEASE_NAMEを指定することで特定のchartのみ削除することができます。

helm delete [flags] RELEASE_NAME [...]

docs.helm.sh

helmfile delete xxxxxを打ったあとに、以下の表示が出ました。

release aaaaa deleted
release bbbbb deleted
release ccccc deleted
release ddddd deleted
release eeeee deleted

あれ🙁?

Kubernetesで管理している各サービスにアクセスすると....

f:id:takamii228:20180703222139p:plain

😨😨😨

f:id:takamii228:20180703222139p:plain

😱😱😱😱😱😱

全部消えとるがなー!!

helmfileのREADME.mdを確認すると

delete delete charts from state file (helm delete)

ぜ、全部消えるんかい。。。

github.com

幸いにも作り直そうとしてるService意外にアタッチしていたPVCのpersistentVolumeReclaimPolicyをRetainにしていたので、再度helmfile syncしてPVCをアタッチしなおすことで即座に復旧するとができました。

もしpersistentVolumeReclaimPolicyがデフォルトのDeleteだった場合は今まで設定したものが全部吹っ飛ぶことになっていたと思うと背筋が凍りました。

Issueを上げてもらった

github.com

私みたいな被害者が今後出ないことを切に祈ります 🙏

教訓

  • 不慣れなコマンドはちゃんと確認してから実行するべし。