Jenins Pipeline 使用 Global Pipeline Libraries
背景
大量的 jenkins job 如果单独使用 pipeline 不好管理和维护,修改一处地方可能需要更改很多的 job,所以使用 Global Pipeline Libraries 来对 jenkins pipeline 进行管理
配置 Global Pipeline Libraries
把固定的模板 groovy 脚本放上 gitlab
我这里是 https://gitlab.huidiancloud.com/devops/jenkins-library.git
groovy 脚本放在 vars 文件夹下,这是固定的规范
例子说明
这是 k8sJDK11Deploy.groovy 的文件,主要用于在K8S中部署 JDK11 后端服务
def call(Map config) {
pipeline {
agent any
parameters {
gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'deployBranch', type: 'PT_BRANCH_TAG', listSize: '25', sortMode: 'DESCENDING_SMART', useRepository: '.*.git'
}
stages {
stage('拉取代码') {
// 这里 branches 必须写 ${params.deployBranch}
// 用户指定的参数前面需要指定 config,以上面的 Map config 相对应
steps {
echo "开始更新,本次版本号:${env.BUILD_NUMBER}"
checkout([$class: 'GitSCM',
branches: [[name: "${params.deployBranch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
gitTool: 'Default',
submoduleCfg: [],
userRemoteConfigs: [[url: "${config.gitUrl}", credentialsId: 'GITLAB' ]]
])
}
}
stage('构建代码') {
// Jenkins的环境变量前面需要加 env
steps {
sh """
cd ${env.WORKSPACE}
JAVA_HOME=/data/java/jdk-11.0.4
CLASSPATH=/data/java/jdk-11.0.4/lib/
PATH=/data/java/apache-maven-3.6.3/bin:/data/java/jdk-11.0.4/bin:$PATH
export PATH JAVA_HOME CLASSPATH
mvn clean
mvn package -Dmaven.test.skip=true -U
"""
}
}
stage('创建镜像') {
steps {
sh """
cd ${env.WORKSPACE}/target
cp ${env.WORKSPACE}/src/main/docker/${config.dockerFile} Dockerfile
[ -d ${env.WORKSPACE}/upload_dir ] && cp -af ${env.WORKSPACE}/upload_dir ./
sudo docker build -t ${config.registryUrl}/${config.group}/${config.projectName}:${env.BUILD_NUMBER} .
"""
}
}
stage('推送镜像'){
steps {
sh """
sudo docker push ${config.registryUrl}/${config.group}/${config.projectName}:${env.BUILD_NUMBER}
sudo docker rmi ${config.registryUrl}/${config.group}/${config.projectName}:${env.BUILD_NUMBER}
"""
}
}
stage('部署环境') {
steps{
sh """
ssh ${config.remoteServer} -p ${config.remotePort} 'sudo sed -i "s#image: ${config.registryUrl}.*#image: ${config.registryUrl}/${config.group}/${config.projectName}:${env.BUILD_NUMBER}#g" /data/yaml/${config.nameSpace}/${config.projectName}/deployment.yaml'
ssh ${config.remoteServer} -p ${config.remotePort} 'sudo kubectl apply -f /data/yaml/${config.nameSpace}/${config.projectName}/deployment.yaml'
"""
}
}
}
}
}
@Library('jenkins-library')_ //开头必须写成这样
// 定义一个 map, 把每个项目不同的变量传入
def map = [
// 项目名,默认与 job 名字相同
projectName : "${JOB_BASE_NAME}",
// 项目 gitlab 代码位置
gitUrl : 'http://gitlab.huidiancloud.com/reform-spot/backend/activiti-server.git',
// 镜像仓库项目
group : 'test-gd_sx-genco-spot',
// 命名空间,以命名空间区分项目
nameSpace : 'spot-standard',
// 使用的 Dockerfile 配置
dockerFile : 'Dockerfile',
// 远程部署目标机器
remoteServer : 'k8s-jenkins@172.18.113.129',
// 远程部署目标机器SSH端口
remotePort : '43999',
// 镜像仓库 url
registryUrl : 'harbor.junengcloud.com'
]
//使用 k8sJDK11Deploy 调用 gitlab 上面的 k8sJDK11Deploy.groovy,并把 map 传入
k8sJDK11Deploy map