Jenkins CI

Jenkins Variables

Jenkins 提供了许多内置变量,可以用来生成唯一的镜像标签。常用的变量包括:

  • BUILD_ID:当前构建的唯一 ID。

  • BUILD_NUMBER:当前构建的编号(每次构建递增)。

    Build number

  • GIT_COMMIT:当前 Git 提交的 SHA-1 哈希值(前 7 位即可)。

  • BRANCH_NAME:当前 Git 分支的名称。

Classic Jenkinsfile Example

pipeline {
    environment {
        // DOCKER_IMAGE_TAG = "${env.GIT_COMMIT.substring(0, 7)}"
        DOCKER_IMAGE_TAG = "0.${env.BUILD_NUMBER}"
        DOCKER_IMAGE = "harbor.frombyte.auto/library/my-nginx:${DOCKER_IMAGE_TAG}"
        REGISTRY_CREDENTIAL = '53464224-8c68-45a8-adb1-e8974d14e122'
    }

    agent {
        node {
            label 'rancher'
        }
    }

    stages {
        stage('Check Tools Version') {
            steps {
                sh 'git --version'
                sh 'docker --version'
            }
            post {
                failure {
                    echo "Error: Failed to check tools version!"
                }
            }
        }

        stage('Prepare') {
            steps {
                sh '''
                    if [ ! -d "automation" ]; then
                        git clone https://gitea.tryanks.com/burgess/automation.git
                        cd automation
                    else
                        cd automation
                        git fetch --all
                        git reset --hard origin/main
                    fi
                '''
            }
            post {
                failure {
                    echo "Error: Failed to prepare the repository!"
                }
            }
        }

        stage('Build') {
            steps {
                sh 'cd automation && docker build -t ${DOCKER_IMAGE} .'
            }
            post {
                failure {
                    echo "Error: Failed to build the Docker image!"
                }
            }
        }

        stage('Push') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: "${REGISTRY_CREDENTIAL}",
                    usernameVariable: 'HARBOR_USERNAME',
                    passwordVariable: 'HARBOR_PASSWORD'
                )]) {
                    sh '''
                        docker login -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD} harbor.frombyte.auto
                        docker push ${DOCKER_IMAGE}
                        docker logout
                    '''
                }
            }
            post {
                failure {
                    echo "Error: Failed to push the Docker image!"
                }
            }
        }
    }

    post {
        always {
            sh 'docker rmi ${DOCKER_IMAGE} || true'
        }
        failure {
            echo "Pipeline failed! Check the logs for more details."
        }
        success {
            echo "Pipeline succeeded!"
        }
    }
}