前回からわかったことがある。
今回の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