文章目录
- 任务类型
- Pipeline流水线项目
- 声明式的Pipeline
- 脚本式Pipeline
- 示例脚本
- 生成Tools配置示例
- 高级
- Pipeline Script from SCM
任务类型
在Jenkins中,有不同类型的任务(项目)适用于不同的构建需求。以下是一些常见的Jenkins任务类型:
自由风格项目(FreeStyle Project):
- 自由风格项目是Jenkins中最灵活的项目类型。
- 允许通过简单的构建步骤配置来构建软件项目,支持Shell脚本、Windows批处理脚本等。
- 适用于简单的构建需求,例如编译、打包、测试和部署。
Maven项目:
- Maven项目是专为使用Maven构建工具的项目设计的。
- 允许配置Maven构建步骤,自动下载依赖、执行生命周期阶段等。
- 适用于Java项目,特别是使用Maven构建工具的项目。
Pipeline流水线项目:
- Pipeline项目使用Jenkins Pipeline语法,允许以代码形式定义整个CI/CD流水线。
- 支持复杂的构建、测试、部署和其他自动化流程,有更强大的灵活性。
- 可以在Jenkinsfile中定义Pipeline,并将Pipeline存储在源代码仓库中。
- 支持从版本控制系统中读取Jenkinsfile,以代码的方式定义整个流水线。
- 适用于复杂的CI/CD流程,需要定义多个阶段和任务的项目。
实际企业项目中大多数使用
Pipeline流水线项目
类型。
Pipeline流水线项目
Pipeline(流水线)是Jenkins中的一种工作流插件,允许你以代码的形式定义整个CI/CD过程。
实现单个任务难以完成的复杂流程编排和可视化的工作。
可编程性: 使用Groovy脚本语言编写Pipeline脚本,这意味着你可以通过代码控制流水线的每个步骤。
可视化: 提供了可视化的流水线编辑器,帮助你直观地了解和修改整个流程。
可重用性: Pipeline的脚本可以存储在版本控制系统中(如Git),从而提供了可重用的、版本化的构建配置。
持久化: 支持将Pipeline的定义保存为代码(Jenkinsfile),从而可以将流水线的配置与代码一起存储。
Pipeline支持两种语法:声明式(Declarative)和脚本式(Scripted Pipeline)语法。
声明式的Pipeline
stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。
stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码、编译构建、部署等阶段。
steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码、ssh远程发布等任意内容。
pipeline {agent anystages {stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}
}
运行完阶段视图如下:
日志如下:
Started by user laker
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /root/.jenkins/workspace/ppp
[Pipeline] {
[Pipeline] stage
[Pipeline] { (拉取代码)
[Pipeline] echo
拉取代码
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (编译构建)
[Pipeline] echo
编译构建
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (项目部署)
[Pipeline] echo
项目部署
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
脚本式Pipeline
Node :节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境。
Stage :阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念。
Step :步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令一样。
node {def mvnHomestage('Preparation') {echo '拉取代码'}stage('Build') {echo '编译构建'}stage('Results') {echo '项目部署'}
}
示例脚本
可以参考看图中的示例代码和在线可视化的流水线语法
生成Tools配置示例
示例脚本
pipeline {// 在任何代理节点运行agent anytools {// maven3.6.0 要在 jenkins全局工具配置中提前配置好maven 'maven3.6.0'}stages {stage('构建') {steps {// 从Gitee仓库获取代码git 'https://gitee.com/lakernote/easy-admin.git'// 运行Mavensh "mvn -Dmaven.test.failure.ignore=true clean package"}post {// 如果Maven能够运行测试,即使有一些测试失败,也记录测试结果并归档jar文件。success {junit '**/target/surefire-reports/TEST-*.xml'// 会把target/*.jar文件归档到Jenkins的工作目录中的 archive 目录下archiveArtifacts 'target/*.jar'}}}stage('部署') {steps {// TODO: 在这里添加部署步骤,将构建生成的文件部署到服务器或其他目标。// 示例:可以使用SCP、SSH或其他部署工具sh "echo 'Add your deployment steps here'"}}}post {// 构建后的操作always {// TODO: 在这里添加任何构建后操作,例如清理、通知等。sh "echo 'Add your post-build steps here'"}}
}
高级
Pipeline Script from SCM
上面是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,建议把Pipeline脚本放在项目中(一起进行版本控制)。
第一步 在项目根目录建立Jenkinsfile文件,把内容复制到该文件中,然后提交到Git。
第二步 配置流水线
执行结果
错误不用管,只是演示这个过程。
Downloaded from aliyun-public: https://maven.aliyun.com/repository/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.jar (74 kB at 191 kB/s)
[[1;34mINFO[m] Reading assembly descriptor: assembly/assembly.xml
[[1;34mINFO[m] Building zip: /root/.jenkins/workspace/ppp/target/easyAdmin-local-1.0.0.zip
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] [1;32mBUILD SUCCESS[m
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
[[1;34mINFO[m] Total time: 01:50 min
[[1;34mINFO[m] Finished at: 2024-02-29T15:21:24+08:00
[[1;34mINFO[m] [1m------------------------------------------------------------------------[m
Post stage
[Pipeline] junit
Recording test results
No test report files were found. Configuration error?
Error when executing success post condition:
Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 92192139-d4ce-4bf3-8572-6c7c73bf5d32
hudson.AbortException: No test report files were found. Configuration error?at hudson.tasks.junit.JUnitParser$ParseResultCallable.invoke(JUnitParser.java:193)at hudson.FilePath.act(FilePath.java:1232)at hudson.FilePath.act(FilePath.java:1215)at hudson.tasks.junit.JUnitParser.parseResult(JUnitParser.java:125)at hudson.tasks.junit.JUnitResultArchiver.parse(JUnitResultArchiver.java:160)at hudson.tasks.junit.JUnitResultArchiver.parseAndSummarize(JUnitResultArchiver.java:254)at hudson.tasks.junit.pipeline.JUnitResultsStepExecution.run(JUnitResultsStepExecution.java:63)at hudson.tasks.junit.pipeline.JUnitResultsStepExecution.run(JUnitResultsStepExecution.java:29)at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at java.base/java.lang.Thread.run(Thread.java:829)[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (部署)
Stage "部署" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] sh
+ echo Add your post-build steps here
Add your post-build steps here
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: No test report files were found. Configuration error?
Finished: FAILURE
阶段视图: