什么是Jenkins的流水线
Jenkins 流水线 (或简单的带有大写"P"的"Pipeline") 是一套插件,它支持实现和集成持续交付流水线 到Jenkins。
(CD) pipeline_是你的进程的自动表达,用于从版本控制向用户和客户获取软件。 你的软件的每次的变更 (在源代码控制中提交)在它被释放的路上都经历了一个复杂的过程 on its way to being released. 这个过程包括以一种可靠并可重复的方式构建软件, 以及通过多个测试和部署阶段来开发构建好的软件 (c成为 "build") 。
流水线提供了一组可扩展的工具,通过 Pipeline domain-specific language (DSL) syntax. [1]对从简单到复杂的交付流水线 "作为代码" 进行建模。
对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),该文件可以被提交到项目的源代码的控制仓库。 [2] 这是"流水线即代码"的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 Jenkinsfile
并提交它到源代码控制中提供了一些即时的好处:
- 自动地为所有分支创建流水线构建过程并拉取请求。
- 在流水线上代码复查/迭代 (以及剩余的源代码)。
- 对流水线进行审计跟踪。
- 该流水线的真正的源代码 [3], 可以被项目的多个成员查看和编辑。
While定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile 中都是相同的, 通常认为在Jenkinsfile
中定义并检查源代码控制是最佳实践
声明式和脚本化的流水线语法
Jenkinsfile 能使用两种语法进行编写 - 声明式和脚本化。
声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:
- 相比脚本化的流水线语法,它提供更丰富的语法特性,
- 是为了使编写和读取流水线代码更容易而设计的
然而,写到Jenkinsfile
中的许多单独的语法组件(或者 "步骤"), 通常都是声明式和脚本化相结合的流水线。 在下面的 [pipeline-concepts] 和 [pipeline-syntax-overview] 了解更多这两种语法的不同。
Why Pipeline?
本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性
- Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力。
- Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。
- Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
- Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括fork/join, 循环, 并行执行工作的能力。
- Extensible:流水线插件支持扩展到它的DSL [1]的惯例和与其他插件集成的多个选项。
然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务, [4] 流水线使这个概念成为了Jenkins的头等公民。
构建一个的可扩展的核心Jenkins值, 流水线也可以通过 Pipeline Shared Libraries 的用户和插件开发人员来扩展。 [5]
下面的流程图是一个 CD 场景的示例,在Jenkins中很容易对该场景进行建模
流水线概念
下面的概念是Jenkins流水线很关键的一方面 , 它与流水线语法紧密相连 (参考 overview below).
流水线
流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
另外 , pipeline 块是 声明式流水线语法的关键部分.
节点
节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。
另外, node
块是 脚本化流水线语法的关键部分
阶段
stage 块定义了在整个流水线的执行任务的概念性地不同的的子集
jenkins创建Pipeline项目
本次环境为:
主机名 | IP地址 | 安装的应用 | 系统版本 |
---|---|---|---|
jenkins | 192.168.23.143 | tomcat jenkins | CentOS 8 |
客户机 | 192.168.23.144 | tomcat jenkins | CentOS 8 |
安装Pipeline、Publish Over SSH、Publish Over SSH、SSH Build Agents、Git、GitHub、GitLab、Gitee插件
- Gitee配置公钥
[root@jenkins ~]# ssh-keygen -t rsa -b 2048 -C "yanchuanglol@163.com" -N "" -f /root/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MtYf5/dFCJuwZ37E4sO3as6b5r0i3xbdoArF1ABiQv8 qinghao_yu@163.com
The key's randomart image is:
+---[RSA 2048]----+
| .o o ...o |
| + . . . |
| . o. . |
| o oo =.. |
| + E.o B.+oo|
| . o.. X.o..o|
| ...* +..|
| o.+O.o.|
| BO==..|
+----[SHA256]-----+
-
登录Gitee然后将公钥复制进去
-
添加私钥
[root@jenkins ~]# cat /root/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
······
DVnODEbPs8q/FQM09wp8Cjk5ephdqdkyiUIyQPAAAAAwEAAQAAAQEAttAv7CgVzBpdYyyN
O0Lkzo0W/vmEtkI+O7kThleV9OBao8usZShckZyprJp0S376JG9W/ipG2FvF583ipR+Ulf
sEFD14o8OhoGa2E82WIr+sVjKM0tlJh0ncJGqd9aFAk23LEDcAAACBAN+sdj81xrcRXWob
EfqJGeXHHtiHgrtFBIzGnduthLCUJn97IrnSV0Tj+0AE6o1CKrko4ZuOFjMuGpFfN62sjC
yw8w1MVMG7xAfkvJiRDbetPeRa8mfMXTKiBPi5Bx8NDW9ctXSDomv8ChP25b7CEh71imLk
......
-----END OPENSSH PRIVATE KEY-----
创建一个项目
//在本地查看拉取下来的代码
[root@jenkins ~]# cd .jenkins/
[root@jenkins .jenkins]# ls
com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig.xml
com.dabsquared.gitlabjenkins.GitLabPushTrigger.xml
com.gitee.jenkins.connection.GiteeConnectionConfig.xml
com.gitee.jenkins.trigger.GiteePushTrigger.xml
config.xml
hudson.model.UpdateCenter.xml
hudson.plugins.git.GitTool.xml
identity.key.enc
jenkins.install.InstallUtil.lastExecVersion
jenkins.install.UpgradeWizard.state
jenkins.model.JenkinsLocationConfiguration.xml
jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
jenkins.security.QueueItemAuthenticatorConfiguration.xml
jenkins.security.UpdateSiteWarningsConfiguration.xml
jenkins.telemetry.Correlator.xml
jobs
logs
nodeMonitors.xml
nodes
org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml
plugins
queue.xml
queue.xml.bak
secret.key
secret.key.not-so-secret
secrets
updates
userContent
users
workflow-libs
workspace
[root@jenkins .jenkins]# cd workspace/
[root@jenkins workspace]# ls
tomcat_demo
[root@jenkins workspace]# ls tomcat_demo/
db Dockerfile LICENSE pom.xml README.md src
- 开始打包
pipeline {
agent any
stages {
stage('pull code') {
steps {
git 'http://github.com/lizhenliang/tomcat-java-demo.git'
}
}
stage('package') {
steps {
sh """
mvn clean
mvn package
"""
}
}
}
}
-
看到下面内容表示拉取完成
-
给客户机做免密认证
[root@Jenkins ~]# ssh-keygen -t rsa
[root@Jenkins ~]# ssh-copy-id root@192.168.23.144
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.23.144's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.23.144'"
and check to make sure that only the key(s) you wanted were added.
yc
//关闭防火墙与selinux0
setenforce 0
systemctl disable --now firewalld
//图中完整代码为
pipeline {
agent any
stages {
stage('pull code') {
steps {
git 'http://github.com/lizhenliang/tomcat-java-demo.git'
}
}
stage('package') {
steps {
sh """
mvn clean
mvn package
"""
}
}
stage('deploy') {
steps {
sh """
scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.23.144:/usr/src/tomcat/webapps/
ssh root@192.168.23.144 '/usr/src/tomcat/bin/catalina.sh stop && /usr/src/tomcat/bin/catalina.sh start'
"""
}
}
}
}
-
看到与下图内容相同则成功
-
浏览器访问yc的ip看到下图内容则成功