Jenkins 流水线(Pipeline)是一种用于实现持续集成(CI)和持续交付(CD)的工具,它允许用户以代码的形式定义整个软件构建、测试和部署的过程。流水线使用一种特定的脚本语言(Groovy)来编写,这种脚本直接在 Jenkins 服务器上运行,允许高度的定制化和灵活性。
Jenkins 流水线有两种类型:
流水线可以存储在源代码仓库中(如 Git、SVN 等),这样就实现了流水线的版本控制,这也是持续交付实践中的一个重要组成部分。这种方式被称为“流水线即代码”(Pipelines as Code)。
流水线的典型结构包括以下几个阶段:
在Jenkins中,"自由风格的软件项目"(Freestyle Project)和"流水线"(Pipeline)代表了两种不同的构建和自动化策略,每种都有其独特的应用场景和优势。
自由风格的项目是Jenkins中最传统和基础的项目类型,它提供了大量的灵活性,允许用户自定义构建步骤,包括执行shell命令、调用Maven或Ant目标、执行脚本等。自由风格项目的构建过程通常由一系列独立的步骤组成,这些步骤可以按顺序执行,也可以并行执行,具体取决于项目的配置。
自由风格项目的构建触发器也十分灵活,可以手动启动构建,或者根据源代码仓库的更新、定时计划(cron表达式)、其他项目的构建状态等自动触发。
相比之下,Jenkins流水线(Pipeline)提供了一种更现代化的方法来定义和执行持续集成和持续交付(CI/CD)流程。流水线项目的核心理念是将构建、测试和部署等流程作为代码(Code as a Pipeline)来编写和管理,这通常使用Groovy语言在Jenkinsfile中完成。
流水线项目允许你以声明式或脚本式的方式定义构建流程,这使得流程不仅可读性强,而且可以轻松地进行版本控制和重用。流水线还支持高级功能,如并行执行阶段、条件执行、参数化构建、错误处理等。
流水线项目可以被设计成非常复杂,包括多个阶段,每个阶段可能包含多个并行或顺序执行的任务。流水线还可以利用Jenkins的插件生态系统,实现与各种工具和服务的集成,如源代码管理系统、构建工具、测试框架和部署平台。
选择使用自由风格的项目还是流水线项目,主要取决于你的具体需求和场景:
总的来说,自由风格的项目适合那些构建流程较为固定和简单的项目,而流水线项目则更适合那些构建流程复杂、需要频繁变化和高度自动化管理的大型项目。随着DevOps实践的普及,流水线项目因其强大的功能和灵活性,正逐渐成为Jenkins中更受欢迎的项目类型。
创建一个流水线
选择一个hello world脚本
保存后执行
自定义流水线内容如下
pipeline {
agent any
stages {
stage('拉取Git代码') {
steps {
echo '拉取Git代码 --success'
}
}
stage('检测代码质量') {
steps {
echo '检测代码质量 --success'
}
}
stage('构建代码') {
steps {
echo '构建代码 --success'
}
}
stage('制作自定义镜像并发布Harbor') {
steps {
echo '制作自定义镜像并发布Harbor --success'
}
}
stage('通知服务器拉取镜像部署') {
steps {
echo '通知服务器拉取镜像部署 --success'
}
}
}
}
然后进行构建
我们可以通过版本控制来维护我们的脚本文件
填写脚本文件所在的git项目地址和认证信息
在项目中新增Jenkinsfile文件,写好脚本,提交到git
pipeline {
agent any
// 存放所有任务的合集
stages {
stage('拉取Git代码') {
steps {
echo '拉取Git代码--success'
}
}
stage('检测代码质量') {
steps {
echo '检测代码质量--success'
}
}
stage('构建代码') {
steps {
echo '构建代码--success'
}
}
stage('制作自定义镜像并发布Harbor') {
steps {
echo '制作自定义镜像并发布Harbor--success'
}
}
stage('基于Harbor部署工程') {
steps {
echo '基于Harbor部署工程--success'
}
}
}
}
提交后去jenkins执行构建,发现比之前多了一个checkout scm的步骤,就是从git获取脚本
jenkins中可以使用流水线语法,通过一系列配置,jenkins会生成脚本
我们还是在配置项增加tag标签配置,后续通过标签拉取代码
保存后进入流水线语法,生成拉取git代码的脚本
填写项目地址信息
将脚本内容复制到Jenkinsfile的拉取Git代码步骤
然后注意这里他是默认从master分支拉取代码,我们需要从指定标签拉取代码,更改一下这里的master为指定标签
保存后提交代码到git,然后jenkins执行构建,查看日志
回到语法流水线生成构建脚本
命令内容如下,这里的maven路径换成自己jenkins容器中的maven路径
/opt/apache-maven-3.6.3/bin/mvn clean package -DskipTests
把生成的内容放到jenkinsfile文件的构建代码步骤
提交到git后,再去执行构建,点击查看日志
操作成功
这里还是要执行shell脚本去调用sonar scanner扫描代码
Shell Script内容如下,这里的sonar.login的token换成自己的
/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=squ_aa85b8b5d377365e795102e555498d70a0e7f9e6
将生成的脚本复制到Jenkinsfile文件的SonarQube检测代码质量节点下
提交git后jenkins执行构建,查看质量检测阶段日志
sonarqube中也可以看到分析结果
Jenkinsfile中配置环境变量
environment {
harborUser="admin"
harborPwd="Harbor12345"
harborAddress="192.168.56.6:80"
harborRepo="repo"
}
进入流水线语法继续编辑脚本
命令内容
mv ./target/*.jar ./docker/
docker build -t ${harborAddress}/${harborRepo}/${JOB_NAME}:$tag -f docker/DockerFile docker/
将生成脚本复制到jenkinsfile文件的构建Docker镜像步骤
提交代码后,jenkins执行构建日志如下
docker image也可以查看到刚刚构建的镜像
进入流水线语法继续编辑脚本,内如如下
docker login -u ${harborUser} -p ${harborPwd} ${harborAddress}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:$tag
生成的脚本复制到Jenkinsfile的推送镜像到Harbor步骤
提交代码后,jenkins执行构建
去仓库查看镜像
声明两个端口参数
回到流水线语法
填写命令,生成脚本
将脚本复制到Jenkinsfile的目标服务器部署服务步骤
这里要注意,execCommand执行的命令要改成用双引号括起来,提交到git后去jenkins执行构建命令
操作成功
访问目标服务路径