Jenkins Pipeline系列(二)—— 使用扩展共享库构建Maven项目

date
Oct 7, 2020
slug
ci-maven
status
Published
tags
DevOps
Maven
summary
type
Post
💡
用代码的方式,管理日常的构建

1.Maven Project构建的阶段(简单流程)

  1. 清理工作区
  1. 获取code
  1. 加载CI配置文件
  1. 打包
  1. 工件归档
  1. 部署或其他操作
  1. 通知构建结果(这里用的是钉钉)
💡
上面仅仅是针对一般类型项目进行的构建阶段说明,可以针对自己的要求进行增减(还可以包含docker镜像的打包、推送私服、git tag等等)

2.Maven Demo Project

.
├── README.md
├── app                   # 主要的code存放module
├── assembly              # 打包module
├── commitlint.config.js  # git commit message插件配置
├── config                # 相关yml properties配置module
├── jenkins.groovy        # Jenkins Pipeline调用的配置文件
├── maven                 # mvnw
├── mvnw
├── mvnw.bat
├── package.json          # git commit 依赖包相关
└── pom.xml
上图是标准的Maven多module项目结构,其中有一个jenkins.groovy是和Jenkins Pipeline相关的
//打包配置文件,配置打包相关信息,CI打包的时候会加载这个文件

// 项目名称
env.PROJECT_CHINESE_NAME = "michael的测试项目"
// 英文名字,用于产物命名,不要随意修改
env.PROJECT_ENGLISH_NAME = "michael-jenkins-pipeline-demo"
// 归档文件正则,如:*.jar
env.ARCH_FILE_PATTERN = "assembly/target/michael-jenkins-pipeline-demo-deploy.zip"

3.Pipeline Scripts

3.1 辅助脚本

# 在vars新建fetch_code.groovy
# BUILD_BRANCH为输入参数

def call(GIT_URL) {
    git branch: "${BUILD_BRANCH}",
    credentialsId: '你的凭证',
    url: "${GIT_URL}"
}

# 在vars新建log.groovy

def info(message) {
    echo "INFO: ${message}"
}

def warning(message) {
    echo "WARNING: ${message}"
}

def error(message) {
    echo "ERROR: ${message}"
}

# 在vars新建dingding.groovy
def notice(branch) {
    duration = currentBuild.duration / 1000
    statusMessage = ''
    buildStatusMessage = currentBuild.currentResult
    if(buildStatusMessage == 'SUCCESS') {
        statusMessage="**<font color=red>成功</font>**"
    }else {
        statusMessage="**<font color=red>失败</font>**"
    }
    dingtalk (
        robot: '机器人code',
        type: 'MARKDOWN',
        atAll: false,
        title: "${JOB_NAME} BUILD",
        text:[
        "# 【${JOB_NAME}】构建完成",
        "",
        "---",
        "构建结果: ${statusMessage}",
        "> [查看控制台](${BUILD_URL})",
        "- 构建分支: ${branch}",
        "- 构建用时: ${duration} 秒"
        ]
    )
}

3.2 构建脚本

/* Config {
    deployPath: 部署路径
}
*/
def call(Map config) {
    node('java') {
        properties([
            buildDiscarder(
                logRotator(
                    daysToKeepStr: '30',
                    numToKeepStr: '50'
                )
            )
        ])
        stage('清理工作区') {
            log.info '清理工作区'
            deleteDir()
        }
        stage('获取代码') {
            log.info "获取代码地址:${REPO_URL},获取代码分支: ${BUILD_BRANCH}"
            fetch_code "${REPO_URL}"
        }
        stage('加载CI配置文件') {
            log.info "加载CI配置文件"
            jenkinsConfigFile="./jenkins.groovy"
            if (fileExists("${jenkinsConfigFile}")) {
                load "${jenkinsConfigFile}"
                log.info "找到打包参数文件${jenkinsConfigFile},加载成功"
            } else {
                log.error "${jenkinsConfigFile}不存在,请在项目${jenkinsConfigFile}里面配置打包参数"
                sh "exit 1"
            }
        }
        stage('构建') {
            log.info '构建'
            sh "mvn wrapper:wrapper && ./mvnw clean package -Dmaven.test.skip=true"
        }
        stage('工件归档') {
            log.info '工件归档'
            archive_file = "${ARCH_FILE_PATTERN}"
            echo "Archive ${archive_file}"
            archiveArtifacts artifacts: "${archive_file}", fingerprint: true
        }
        stage('部署 OR 其他操作') {
            log.info "部署分支: ${BUILD_BRANCH}"
            // 进行对象的部署获取其他操作
            currentBuild.description = "代码分支: ${BUILD_BRANCH}<br>"
        }
        stage('通知') {
            dingding.notice("${BUILD_BRANCH}")
        }
    }   
}

© 天行者YANG 2020 - 2022