Devops-Jenkins 流水线pipeline

【百炼成魔】Devops-Jenkins 流水线pipeline

Jenkins流水线任务介绍

之前采用的都是Jenkins的自由风格,每个流程都要通过不同的方式设置,并且构建过程中整体流程时不可见的,无法确认每个流程花费的时间,同时不方便问题的定位。

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

构建Jenkins流水线任务

新建流水线工程

Devops-Jenkins 流水线pipeline_第1张图片

进入工程配置 流水线

Devops-Jenkins 流水线pipeline_第2张图片

点击构建 可以看到流水线任务就是模块化任务,单独的log比自定义工程更方便查询日志方便管理

Devops-Jenkins 流水线pipeline_第3张图片

Groovy脚本基本语法

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 配置全局环境,指定变量名=变量值信息
    environment{
    	host = '192.168.117.141'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
		// 单个任务
        stage('任务2') {
        	// 实现任务的具体流程
            steps {
                echo 'do something'
            }
        }
        // ……
    }
}

配置Git

Devops-Jenkins 流水线pipeline_第4张图片

JenkinsFile实现pipeline

Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取并且获取项目中的Jenkinsfile文件来对项目进行构建

进入代码目录

cd devops-test
vim Jenkinsfile
pipeline {
    agent any

    // 存放所有任务的合集
    stages {
        stage('拉取Git代码') {
            steps {
                echo '拉取Git代码'
            }
        }

        stage('检测代码质量') {
            steps {
                echo '检测代码质量'
            }
        }

        stage('构建代码') {
            steps {
                echo '构建代码'
            }
        }

        stage('制作自定义镜像并发布Harbor') {
            steps {
                echo '制作自定义镜像并发布Harbor'
            }
        }

        stage('基于Harbor部署工程') {
            steps {
                echo '基于Harbor部署工程'
            }
        }
    }
}

Devops-Jenkins 流水线pipeline_第5张图片

推送到仓库

git add * 
git commit -m "create jenkinsfile"
git push -u origin main 

Devops-Jenkins 流水线pipeline_第6张图片

进入gitlab查看

Devops-Jenkins 流水线pipeline_第7张图片

Devops-Jenkins 流水线pipeline_第8张图片

再次点击构建 可以看到工程全部模块化展出,包含项目构建时间,构建状态,构建日志等

Devops-Jenkins 流水线pipeline_第9张图片

流水线任务实现参数化构建

回到工程配置添加参数化构建,方便选择不同的项目版本

Devops-Jenkins 流水线pipeline_第10张图片

拉取Git代码

通过流水线语法生成Checkout代码的脚本

Devops-Jenkins 流水线pipeline_第11张图片

生成脚本并复制 将*/master更改为标签${tag}

Devops-Jenkins 流水线pipeline_第12张图片

image-20230915164827517

修改Jenkinsfile

生成的流水线脚本

checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.141:8929/root/devops-test.git']])

Devops-Jenkins 流水线pipeline_第13张图片

通过脚本执行mvn的构建命令

Devops-Jenkins 流水线pipeline_第14张图片

输入

/var/jenkins_home/maven/bin/mvn clean package

生成的流水线脚本

sh '/var/jenkins_home/maven/bin/mvn clean package'

修改Jenkinsfile

Devops-Jenkins 流水线pipeline_第15张图片

代码质量检测

通过脚本执行sonar-scanner命令即可

/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=8f0b840a4211368e33d38f33ddd0f19c6fc112bd

生成的流水线脚本

sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=8f0b840a4211368e33d38f33ddd0f19c6fc112bd'

Devops-Jenkins 流水线pipeline_第16张图片

要是令牌忘记了再去生成一个即可

Devops-Jenkins 流水线pipeline_第17张图片

修改Jenkinsfile

Devops-Jenkins 流水线pipeline_第18张图片

制作自定义镜像并发布

修改Jenkinsfile 增加环境变量

harborHost = '192.168.117.141:7788'   #地址
harborRepo = 'devops'				  #仓库名
harborUser = 'admin'				  #用户
harborPasswd = 'Harbor12345'          #密码

Devops-Jenkins 流水线pipeline_第19张图片

输入

cd /var/jenkins_home/workspace/${JOB_NAME}/docker
mv ../target/*.jar ./
docker build -t ${JOB_NAME}:$tag .
docker login -u admin -p Harbor12345 192.168.117.141:7788
docker tag ${JOB_NAME}:$tag 192.168.117.141:7788/devops/${JOB_NAME}:$tag
docker push 192.168.117.141:7788/devops/${JOB_NAME}:$tag

Devops-Jenkins 流水线pipeline_第20张图片

生成的流水线脚本

sh '''cd /var/jenkins_home/workspace/${JOB_NAME}/docker
mv ../target/*.jar ./
docker build -t ${JOB_NAME}:$tag .
docker login -u admin -p Harbor12345 192.168.117.141:7788
docker tag ${JOB_NAME}:$tag 192.168.117.141:7788/devops/${JOB_NAME}:$tag
docker push 192.168.117.141:7788/devops/${JOB_NAME}:$tag'''

编写jenkinsfire

Devops-Jenkins 流水线pipeline_第21张图片

生成Publish Over SSH脚本

输入

/usr/bin/devops_start.sh $harborHost $harborRepo $JOB_NAME $tag 

Devops-Jenkins 流水线pipeline_第22张图片

注意这里 由于使用了变量这里的单引号必须改为双引号

image-20230915171638889

生成的脚本 修改双引号为

sshPublisher(publishers: [sshPublisherDesc(configName: 'devops', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/devops_start.sh $harborHost $harborRepo $JOB_NAME $tag", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

修改jenkinsfile

Devops-Jenkins 流水线pipeline_第23张图片

修改完再次推送代码到v1.0.3版本 顺便也推送到main

git add * 
git commit -m "create v1.0.3"
git tag -a v1.0.3 -m "create jenkinsfile"
git push -u origin v1.0.3 
git push -u origin  main 

Devops-Jenkins 流水线pipeline_第24张图片

构建

Devops-Jenkins 流水线pipeline_第25张图片

若机器重启过 导致构建失败 如下图

Devops-Jenkins 流水线pipeline_第26张图片

需要再次配置容器对宿主机的docker权限 并重启jenkins

chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
cd /usr/local/jenkins
docker-compose up -d

再次构建完成

Devops-Jenkins 流水线pipeline_第27张图片

访问IP:9901

image-20230915174540742

sonarqube 也创建了新的工程bug检测

Devops-Jenkins 流水线pipeline_第28张图片

harbor仓库中也存储了工程提交的镜像

Devops-Jenkins 流水线pipeline_第29张图片

提交v1.0.4 测试访问

vim src/main/java/com/example/testinit/controller/HelloWord.java

Devops-Jenkins 流水线pipeline_第30张图片

Devops-Jenkins 流水线pipeline_第31张图片

git add * 
git commit -m "create v1.0.4"
git tag -a v1.0.4 -m "create v1.0.4"
git push -u origin v1.0.4

再次构建v1.0.4 完美访问

Devops-Jenkins 流水线pipeline_第32张图片

image-20230915175225448

Devops-Jenkins 流水线pipeline_第33张图片

Devops-Jenkins 流水线pipeline_第34张图片

jenkins-pipeline 流水线到这里就结束了

你可能感兴趣的:(jenkins,运维,devops,ci/cd)