九、 Jenkins流水线pipeline
完整的笔记,里面有完整的DevOps笔记和K8S集群搭建的笔记
- https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps
Jenkins流水线任务介绍
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的间,并且问题不方便定位问题。Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。所以Pipeline相对自由风格或者其他的项目风格更容易操作。
Jenkins流水线任务
构建Jenkins流水线任务
1. 添加pipeline流水线任务
2. 配置代码仓库
3. 项目中添加Jenkinsfile文件
// 所有的脚本命令都放在pipeline中
pipeline{
// 指定任务在哪个集群节点执行
agent any
// 声明全局变量,方便后面使用
environment{
key='value'
}
stages{
stage('拉取git仓库代码') {
steps {
echo '拉取git仓库代码 -SUCCESS'
}
}
stage('通过maven构建项目') {
steps {
echo '通过maven构建项目 -SUCCESS'
}
}
stage('通过SonarQube做代码质量检测') {
steps {
echo '通过SonarQube做代码质量检测 -SUCCESS'
}
}
stage('通过docker制作自定义镜像') {
steps {
echo '通过docker制作自定义镜像 -SUCCESS'
}
}
stage('将自定义镜像推送到Harbor中') {
steps {
echo '将自定义镜像推送到Harbor中 -SUCCESS'
}
}
stage('通过Publish Over SSH通知目标服务器') {
steps {
echo 'SSH通知目标服务器 -SUCCESS'
}
}
}
}
4. 修改jenkins配置
5. 添加Jenkins配置,完善Jenkins脚本。添加参数化构建的配置
生成每一步的流水线语法,添加到Jenkinsfile对应的流程步骤中。在流水线语法中可以根据自己的需要生成对应的命令。
- 配置拉取代码的配置
stage('拉取git仓库代码') {
steps {
checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.201.112:8929/mytest/mytest.git']])
}
}
再次构建,进入jenkins容器发现已经有拉取下来的代码了,pipeline
[root@clear bin]# docker exec -it jenkins bash
jenkins@e96108b4b77b:/$ cd ~/workspace/
jenkins@e96108b4b77b:~/workspace$ ls
mytest pipeline test
jenkins@e96108b4b77b:~/workspace$
- 配置通过maven构建步骤 shell
/var/jenkins_home/maven/bin/mvn clean package -DskipTests
stage('通过maven构建项目') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
- 配置代码检测,重新构建,去sonarqube服务确认是否有代码检测记录 shell
/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=http://192.168.201.111:9000/ -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=65a1741c6f4191105f68096278fe77adaa1d15a1
stage('通过SonarQube做代码质量检测') {
steps {
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=http://192.168.201.111:9000/ -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=65a1741c6f4191105f68096278fe77adaa1d15a1'
}
}
- 通过docker制作自定义镜像,重新构建,去服务器检查是否有pipeline的镜像 shell
mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:$tag ./docker/
stage('通过docker制作自定义镜像') {
steps {
sh '''mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:$tag ./docker/'''
}
}
- 推送自定义镜像到Harbor中 shell
# 在Jenkinsfile的文件中添加harbor相关配置
// 声明全局变量,方便后面使用
environment{
harborUser='sswang'
harborPasswd='A123456a'
harborAddr='kubernetes-register.sswang.com'
harborRepo='sswang'
}
# 配置镜像推送
docker login -u ${harborUser} -p ${harborPasswd} ${harborAddr}
docker tag ${JOB_NAME}:${tag} ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}
stage('将自定义镜像推送到Harbor中') {
steps {
sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborAddr}
docker tag ${JOB_NAME}:${tag} ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}'''
}
}
- 通过Publish Over SSH通知目标服务器 ssh publish,添加端口号配置,在任务配置中
deploy.sh $harborAddr $harborRepo $JOB_NAME $tag $container_port $host_port
# deploy.sh要用英文双引号
stage('通过Publish Over SSH通知目标服务器') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborAddr $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
完整的Jenkinsfile
// 所有的脚本命令都放在pipeline中
pipeline{
// 指定任务在哪个集群节点执行
agent any
// 声明全局变量,方便后面使用
environment{
harborUser='sswang'
harborPasswd='A123456a'
harborAddr='kubernetes-register.sswang.com'
harborRepo='sswang'
}
stages{
stage('拉取git仓库代码') {
steps {
checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.201.112:8929/mytest/mytest.git']])
}
}
stage('通过maven构建项目') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('通过SonarQube做代码质量检测') {
steps {
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=http://192.168.201.111:9000/ -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=65a1741c6f4191105f68096278fe77adaa1d15a1'
}
}
stage('通过docker制作自定义镜像') {
steps {
sh '''mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:$tag ./docker/'''
}
}
stage('将自定义镜像推送到Harbor中') {
steps {
sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborAddr}
docker tag ${JOB_NAME}:${tag} ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddr}/${harborRepo}/${JOB_NAME}:${tag}'''
}
}
stage('通过Publish Over SSH通知目标服务器') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborAddr $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
- 到服务器docker ps查看运行容器,容器启动成功
然后访问192.168.201.111:8082