Jenkins Pipeline Maven Project
用代码的方式,管理日常的构建
1.Maven Project构建的阶段(简单流程)
- 清理工作区
- 获取code
- 加载CI配置文件
- 打包
- 工件归档
- 部署或其他操作
- 通知构建结果(这里用的是钉钉)
上面仅仅是针对一般类型项目进行的构建阶段说明,可以针对自己的要求进行增减(还可以包含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}")
}
}
}
网友评论