Jenkins Pipeline Maven Project
用代码的方式,管理日常的构建
Maven Project构建的阶段(简单流程)
- 清理工作区
- 获取code
- 加载CI配置文件
- 打包
- 工件归档
- 部署或其他操作
- 通知构建结果(这里用的是钉钉)
上面仅仅是针对一般类型项目进行的构建阶段说明,可以针对自己的要求进行增减(还可以包含docker镜像的打包、推送私服、git tag等等)
Maven Demo Project
1 2 3 4 5 6 7 8 9 10 11 12
| . ├── 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相关的
1 2 3 4 5 6 7 8
|
env.PROJECT_CHINESE_NAME = "michael的测试项目"
env.PROJECT_ENGLISH_NAME = "michael-jenkins-pipeline-demo"
env.ARCH_FILE_PATTERN = "assembly/target/michael-jenkins-pipeline-demo-deploy.zip"
|
Pipeline Scripts
辅助脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| # 在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} 秒" ] ) }
|
构建脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
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}") } } }
|