Jenkins Tips

Jenkins 周りのTipsです。

古いBuildの削除

何度もBuildを実行しているとJenkinsサーバ自体のディスク容量が枯渇してJenkinsがエラーを吐くようになります。この時の対処方法です。

  • まずManage Jenkins -> Script Consoleに移動
  • ここで以下のようなScriptを実行。これだけです。
def jobName = "JobJob" // ジョブ名を指定
def branchName = "master" // ブランチ名を指定
def maxBuildsToKeep = 100 // 保持する最新のビルド数

def job = Jenkins.instance.getItem(jobName)
if (job) {
  for (branch in job.getItems()) {
    if(branch.name == branchName){
      def recent = branch.getBuilds().limit(maxBuildsToKeep) //直近のBuildを取得
      for (build in branch.getBuilds()) {
        if (!recent.contains(build)){
          build.delete()//Buildを削除
        }
      }
    }
  }
} else {
    println("job not found")
}

他にもプラグインを使うという手段も勿論アリだと思います。e.g. Discard Old Build | Jenkins plugin

管理者パスワードをリセット

Jenkins consoleの管理者パスワードを忘れた(失くした)という通常あり得ない事態になったときの対処方法です。実際に遭遇したので。。(僕が失くしたわけではありません😅)

参照したのはこの公式サイトです。

  • まずサーバの設定を変更するのにkey-pairとかパスワードを取得して、なんとか当該サーバPCにログインする。コレができないと残念ながら、もうどうにもならないでしょう。
  • Jenkinsのホームディレクトリにあるconfig.xmlをエディタで開く。Linuxだと /var/lib/jenkins辺りにあると思います。
  • useSecurityタグを探してその値をfalseに変更。保存してファイルを閉じる。
  • Jenkinsを再起動する。Linuxだと systemctl start jenkinsを実行すればよいです。これによりJenkins consoleをログインなしで操作できるsecurity皆無モードになります。早くパスワードをリセットしなきゃ。。
  • Jenkins consoleからManage Jenkinsに行き、SecurityセクションにあるConfigure Global Securityに行く。
  • Security RealmのドロップダウンメニューからJenkins’ own user databaseを選び、Allow users to sign upがチェックされてないことを確認して、Saveする。これでManage Jenkinsに戻る。
  • Usersを選択する。
  • 管理者のUser IDを選択する。
  • 選択したUser IDの設定アイコンからパスワードを変更する。
  • 変更したパスワードでログインする。
  • Manage Jenkinsに行き、SecurityセクションにあるConfigure Global Securityに行く。
  • AuthorizationLogged-in users can do anythingに設定して、Allow anonymous read accessのチェックを外す。
  • 設定を保存する。

以上で完了です。他のユーザ情報は再度設定しなおす必要があるかと思います。Active directoryを使っていればあまり問題ないかと思いますが。

Git checkout

Jenkinsfileでgit repositoryをチェックアウトして、その後チョコッとファイルを編集、commitそしてpushしようとしたらエラーがでた。

error: src refspec release does not match any
error: failed to push some refs to 'ssh://git@gitrepo.com:8080/hogehoge.git'

調べたらどうやらチェックアウトがコミット指定でされているようだ。その場合、checkout時に指定したbranchを参照しているわけではないので、どこにpushしていいのか分からないということらしい。なので以下のようにextensionsにlocalbranchを指定することでpushができた。(git pluginがJenkinsにInstallされていることが前提です)

checkout([$class: 'GitSCM',
            branches: [[name: branch]],
            doGenerateSubmoduleConfigurations: false,
            extensions: [[$class: 'LocalBranch', localBranch: "**"]], //This is required.
            submoduleCfg: [],
            userRemoteConfigs: [
                [credentialsId: credential,
                url: CHECKOUT_SOURCE]]])

Git push

Jenkinsfileでgit pushしようとしてpermission errorが出た。ここではsshを使ってpushする方法を記します。ポイントはwithCredentialsを使いつつwithEnvでGIT_SSH_COMMANDに使用するssh keyを設定しておくことです。これでone shot的にssh接続ができます(git pluginがJenkinsにInstallされていることが前提です。またgit remote repository(githubとかbitbucketとか)にアクセス可能なsshの設定をJenkinsのcredentialsにしておいて下さい)

withCredentials([sshUserPrivateKey(credentialsId: GIT_REPO_CREDENTIAL_ID, keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
            withEnv(["GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=no -o User=${SSH_USER} -i ${SSH_KEY}"]) {
                
                bat "git commit -m \"Commit by Jenkins. (${env.BUILD_URL})\" Comment"
                String tag = "hogehogeTag"
                bat "git tag ${tag}"
                bat "git push origin ${BRANCH}"
                bat "git push origin ${tag}"
            }
        }