Jenkins

Jenkins CLI

# example commands:
# * version
# * clear-queue
# * install-plugin <plugin name>
java -jar jenkins-cli.jar -s http://localhost:8080/ -i .ssh/mykey <command>

定期掃特定 GitHub Organization

github-organization-folder + multi-branch

設定完後就會自動掃 GitHub Organization 的 repo, 只要有符合規則的新 PR 或 Branch 就會觸發 Jenkins 執行, 不同的 Branch 或 PR 會被自動放到不同的資料夾, 另外可以在 Jenkinsfile 內設定送通知道 Slack 之類的地方通知。

Declarative Jenkinsfile

範例

pipeline {
    agent any
    options {
        timestamps()
        disableConcurrentBuilds()
        // Only keep the 5 most recent builds
        buildDiscarder(logRotator(numToKeepStr: '5'))
    }

    parameters {
        // these will let user input some parameters when triggering build
        string(name: 'BRANCH_PROJ1',
               defaultValue: 'develop',
               description: 'PROJ1 build branch')
        string(name: 'BRANCH_PROJ2',
               defaultValue: 'develop',
               description: 'PROJ2 build branch')
    }

    environment {
        // define variable
        JOB_SIGNATURE = "${env.JOB_NAME} ${env.BUILD_NUMBER} (${env.BUILD_URL})"
    }

    stages {
        stage("checking out") {
            steps {
                checkout scm
            }
        }

        stage("check env") {
            steps {
                script {
                    if (params.foo) {
                        sh "echo foo=${params.foo}"
                    }
                }
            }
        }

        stage("build projects") {
            steps {
                script {
                    // use plugin to display terminal color on web
                    ansiColor('xterm') {
                        sh "make all"
                    }
                }
            }
        }
    }

    post {
        always {
            // docker clean up, avoid eating a lot of disk
            sh "docker system prune -f"
        }

        success {
            slackSend channel: '#jenkins-builds',
                      color: '#90EE90',
                      message: "Yes !! PROJS Build Passed - ${JOB_SIGNATURE}"
        }

        failure {
            slackSend channel: '#jenkins-builds',
                      color: '#b20900',
                      message: "No  !! PROJS Build Failed - ${JOB_SIGNATURE}"
        }
    }
}

一些小 Groovy Scripts

列出某個 repo 的所有 branch:

def gettags = "git ls-remote git@github.com:USER/REPO.git".execute(null, null)

return gettags.text.readLines()
          .collect {
            it.split()[1]
              .replaceAll('\\^\\{\\}', '')
              .replaceAll('refs/\\w+/', '')
          }
def gettags = "git ls-remote git@github.com:USER/REPO.git".execute(null, null)

return gettags.text.readLines()
          .collect {
            it.split()[1]
              .replaceAll('\\^\\{\\}', '')
              .replaceAll('refs/\\w+/', '')
          }
          .findAll { !it.startsWith("CI-") }