はじめに
全国のJenkinsおじさんの皆様、こんにちは。
ちょっとJenkinsいじってる系SREエンジニアをやっている@hayaosatoです。
Jenkinsあるあるなのが、Jenkinsおじさんと呼ばれるように属人化してしまう
ことだと思います。
なぜ属人化するのか、その理由の一つに「Jenkinsでの設定のほとんどがGUIで操作できるから」があるのではないかなと個人的に思っています。
しかし、Jenkinsの設定のほとんどはコード管理することができます。
その中で、今回はcredential情報の管理について書いていこうと思います。
Jenkinsの起動時実行スクリプト
Jenkinsでは、$JENKINS_HOME/init.groovy.d/
配下に配置したgroovyスクリプトはJenkinsの起動時に自動的に読み込まれます。
今回はそのJenkinsの起動に実行されるスクリプトでcredentialsの登録をしたいと思います。
credentialsの登録
credential情報として、以下のようなパスワード一覧のtextファイルを配置します。
slack-api-token: xxxxxxxxxx: slackのAPIトークンだよ
パスワード1: xxxxxxxx: xxxのパスワードだよ
import jenkins.model.*
import com.cloudbees.plugins.credentials.*
import com.cloudbees.plugins.credentials.domains.*
import com.cloudbees.plugins.credentials.impl.*
import org.jenkinsci.plugins.plaincredentials.*
import org.jenkinsci.plugins.plaincredentials.impl.*
import hudson.util.Secret
import java.io.BufferedReader
import java.io.FileNotFoundException
import java.io.FileReader
import java.io.IOException
def domain = Domain.global()
def store = Jenkins.instance.getExtensionList("com.cloudbees.plugins.credentials.SystemCredentialsProvider")[0].getStore()
def f = new File("/path/to/credentials.txt") // Jenkins(再)起動前に配置すること。
f.eachLine { line ->
def secrets = line.split(":")
def secretId = secrets[0].replaceAll(' ', '')
def secretPass = secrets[1].replaceAll(' ', '')
def description = secrets[2].replaceAll(' ', '')
def secretText = new StringCredentialsImpl(
CredentialsScope.GLOBAL,
secretId,
description,
Secret.fromString(secretPass)
)
store.addCredentials(domain, secretText)
}
groovyファイルで、このようにcredentialsのファイルを読み込んで、一つずつcredentialとして登録していくことができます。また、後ろの説明も登録することができます。
一度読み込んだらJenkinsを再起動してもcredentialは消えることはないので、一度読み込んだら消すことをお勧めします。
最後に
最近ではGitHubActionsなど、Saasのビルドツールが流行っていますが、セキュリティ上の理由などからまだまだJenkinsは活躍すると思います。
その際にJenkinsおじさんに頼りきってしまうのではなく、IaCで設定をコード管理することで属人化が多少は防げるのではないかなぁと思っております。