为了更好的理解Pipeline脚本和cicd流程,本次将使用一个java语言开发的用户信息管理系统进行实践
- 项目源代码的仓库的地址为
http://172.16.99.82:88/root/java-web-demo.git
1 Pipeline脚本基本结构
-
我们将Pipeline脚本的构建过程分为拉取代码、代码编译、构建镜像、部署到K8s集群、反馈5个阶段。如下图所示
-
各阶段的任务如下:
1、拉取代码阶段
- 从代码仓库拉取最新代码
- 根据选择的分支拉取对应的代码版本
2、代码编译阶段
- 执行代码编译工作
- 生成可部署的文件
3、构建镜像阶段
- 编写Dockerfile
- 构建镜像
- 推送镜像到镜像仓库
4、部署到k8s集群阶段
- 编写资源配置
- kubectl执行部署和更新操作
5、反馈阶段
- 发送通知到钉钉群或邮箱告知执行结果
- 综上所述,Pipeline脚本结构如下
pipeline {
agent {
kubernetes {
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: uhub.service.ucloud.cn/librarys/jenkins/inbound-agent:latest-jdk21
args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
'''
}
}
stages {
stage('拉取代码') {
steps {
echo "拉取代码..."
}
}
stage('代码编译') {
steps {
echo "代码编译..."
}
}
stage('构建镜像') {
steps {
echo "构建镜像..."
}
}
stage('部署到k8s集群') {
steps {
echo "部署到k8s集群..."
}
}
post {
always {
echo "构建完成"
}
success {
echo "构建成功"
}
failure {
echo "构建失败"
}
}
}
}
2、拉取代码阶段
- 拉取代码步骤可以通过片段生成器生成,在生成器中选择checkout: Check out from version control,输入仓库地址、访问凭据和构建分支。具体配置如下图所示:
- 将生成的Pipeline代码片段复制到Pipeline中,如下所示
stage('拉取代码') {
steps {
checkout scmGit(branches: [[name: '*/dev']], extensions: [], userRemoteConfigs: [[credentialsId: '0b376781-1e95-417f-9fae-aec4deb7f966', url: 'http://172.16.99.82:88/root/java-web-demo.git']])
}
}
为了让用户在触发构建时可以选择并动态获取分支,这里使用Git Parameter,该Parameter由Git Parameter插件提供,该插件需要额外安装。这个步骤可以通过声明式指令生成器生成,在生成器中选择parameters: Parameter,然后添加Git Parameter,输入名称、描述、参数类型和默认分支。
- 具体配置如下图所示
- 将生成的代码片段复制到Pipeline中,如下图所示
parameters {
gitParameter branch: '', branchFilter: '.*', defaultValue: 'dev', description: '请选择构建的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
}
stages {
stage('拉取代码') {
steps {
checkout scmGit(branches: [[name: "${params.Branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: '0b376781-1e95-417f-9fae-aec4deb7f966', url: 'http://172.16.99.82:88/root/java-web-demo.git']])
}
}
}
同时,将scmGit中的分支名称*/dev 设置为${params.Branch},以便根据用户选择的分支名称拉取代码
3、代码编译阶段
这个java web项目使用Maven工具进行项目管理。因此,在这个阶段需要执行 mvn clean package命令进行代码编译和构建,该命令执行完成后将生成一个可部署的jar文件。将该命令放置在代码编译阶段中,如下所示
stage('代码编译') {
steps {
sh 'mvn clean package'
}
}
- 这个时候会引发一个问题:mvn命令是否可以顺利执行?
- 答案是否定的,因为这个命令会在代理pod中执行,而代理pod是由uhub.service.ucloud.cn/librarys/jenkins/inbound-agent:latest-jdk21镜像构建的,该镜像仅运行代理程序,并没有提供Maven环境
- 为了解决这个文件,需要确保代理pod中具备Maven环境,这可以通过以下两种方法实现:
- (1)基于uhub.service.ucloud.cn/librarys/jenkins/inbound-agent:latest-jdk21镜像构建一个包含Maven环境的镜像,并使用该镜像创建代理pod