スキップしてメイン コンテンツに移動

Jenkins v2とGitHubの連携 Release編

前回からわかったことがある。
今回のJenkins環境は、インフラチームにManageしてもらっている環境なのだけど、JenkinsのRestartとReloadがあり、
Jenkinsで、"Install plugin and restart jenkins after no running job?" と出てOKとすると、Running jobがなければ数秒後にリスタートしているっぽい画面になる。
が、これが今回の一つのはまりどころで、これではJenkinsの設定がReloadされはするものの、Jenkins自体はRestartされないらしい。

このあたりが、Restartというのが何を指しているのかわからない。(プロセスの再起動がRestartなのだろうか、だとしたらReloadはなんらかの内部的なRefresh的な?)
ただ、前回必要な項目が出てこないのは単にPluginが適用されてなかったからだった模様。

そもそもtriggersは設定しなくて良くて、といった内容を含んだSeed Job(Jobを作るためのJob)を実行すれば、実際のPipelineのステップ(Jenkinsfile)ではその辺りを気にしなくて良いみたいね。

branchSources {
 github {
   buildOriginBranch(true)
   buildOriginPRHead(true)
   includes('*')
   excludes('')
 }
}

ようやくわかってきたけれど、JenkinsのConfiguration as Code(CasC)としては、
Jenkins自体の設定(jenkins.yaml)とそのJenkins上で動かすJob(xxxx.groovy)とそのJobの中で動くPipeline(Jenkinsfile)があって、Jenkins上で動かすJobをCasCとして保持したい場合はなんらかgroovyファイルとして書いて、次のような形で持っておけば良さそう。
ちなみにMulti Branch PipelineのときはPipelineのファイル名はJenkinsfileで固定が基本みたい。(ちょっと検索した感じ、変えられるけどしんどそうだった)

api_uri = "https://GitHub Enterpriseのホスト/api/v3"
job_name = "作るJobの名前"
job_description = "作るJobの説明"
job_id = job_name
repo_name = "参照するRepositoryの名前"
repo_owner = "参照するRepositoryのOwner"
credentials_id = "Jenkinsで管理されているCredential Manager内にあるID"
multibranchPipelineJob(job_name){
 description(job_description)
 branchSources{
   github{
     apiUri(api_uri)
     scanCredentialsId(credentials_id)
     id(job_id)
     repoOwner(repo_owner)
     repository(repo_name)
     // Build fork PRs (unmerged head).
     buildForkPRHead(true)
     // Build fork PRs (merged with base branch).
     buildForkPRMerge(true)
     // Build origin branches.
     buildOriginBranch(true)
     // Build origin branches also filed as PRs.
     buildOriginBranchWithPR(false)
     // Build origin PRs (unmerged head).
     buildOriginPRHead(true)
     // Build origin PRs (merged with base branch).
     buildOriginPRMerge(true)
     includes('*')
     excludes('')
   }
 }
}


で、今回はこの問題を乗り越えてGitHubへ自動でビルド結果をReleaseする話で、結果としては下記でできますよ、という感じ。curlかなんか使わない限り厳しそう。
流れとしては、GitHubにリリースを作る、作ったリリースに紐づいて取得できるリリースアセットのURLを取得する、リリースにアセット(ビルド結果とか)を添付する、という感じ。

で、自動でリリースのタグを決めるのが難しかったのでJenkinsのUI上でInputさせる方法に現時点ではしてる。
あと途中で出てくる$ghe_credentialsは事前にJenkinsのCredential Managerに登録したGitHubのPersonal Access TokenをJenkinsの機能で次のように取得してる。

ghe_credentials = credentials("Credentials Managerに登録してあるID")

stage('deploy') {
           when {
               branch 'master'
           }
           steps {
               script {
                   timeout(time: 5, unit: 'MINUTES') {
                       inputTag = input(
                           id: "releaseTag",
                           message: "Please input release tag.",
                           parameters:[
                               string( name: 'tag', description: 'Release tag for GitHub'),
                           ]
                       )
                       release_tag = inputTag
                   }
               }
               echo release_tag
               script {
                   release = sh(returnStdout: true, script: """
                       curl -XPOST -u  $ghe_credentials --data "{\
                           \\\"tag_name\\\": \\\"$release_tag\\\",\
                           \\\"target_commitish\\\": \\\"$GIT_BRANCH\\\",\
                           \\\"name\\\": \\\"\\\",\
                           \\\"body\\\": \\\"\\\",\
                           \\\"draft\\\": false,\
                           \\\"prerelease\\\": false\
                           }" \$api_uri/repos/\$repo_owner/\$repo_name/releases
                       """)
                   def props = readJSON text: release
                   release_upload_url = props["upload_url"].toString() - "{?name,label}"
                   sh(script: """
                       curl -XPOST -u  $ghe_credentials --data-binary @$release_target -H "Content-Type: application/octet-stream"\
                       $release_upload_url?name=$release_target_name
                       """)
               }
           }
       }
   }

三本バックスラッシュが、あーJVM言語だなあ、という感じで、昔書いたJavaのコードを彷彿とさせて懐かしい気持ちにさせられる。
アップロードするファイルの種類によっては最後のアップロードの部分のContent-Typeを変更する必要があるかもしれない。

あと、そうそう。MacのNotesでこの記事のベースを書いているんだけど、勝手にクォーテーションが違う形に変わってしまう事象に気づいた。
気づくと相当に気持ち悪い。で、下記のページで対応方法が書いてあったので、Preferences > Keyboard > Textから見つけて変更した。

Mac のダブルクォーテーションが勝手に変換される問題の対処法 - 強火で進め http://nakamura001.hatenablog.com/entry/20140506/1399363317

参考:
* Repositories - GitHub Docs https://docs.github.com/en/rest/reference/repos#create-a-release