Jenkins 流水线是一套插件,用来实现CI / CD pipeline
Jenkinsfile定义了整个Jenkins Pipeline的执行过程。
Jenkinsfile 本身能使用声明和脚本两套语法,一般推荐使用声明式语法。
Job DSL是Jenkins最早流行的插件之一,它允许将配置写成代码的形式。
DSL代表Domain specific language领域特定语言。Jenkins DSL基于Groovy实现。
[外链图片转存中…(img-rv1wohiX-1705545500712)]
如果之前没有安装过DSL Plugin:
- Manage Jenkins > Manage Plugins > Available Tab
- 在filter框内输入
DSL
,找到Job DSL
,点击install without restart- 点击 restart jenkins when installation is complete and np jobs are running
- 安装完成后进入Installed Tab查看
Pipeline插件准确说使用的是Pipeline DSL来实现CI / CD pipeline。和Jenkins DSL不完全相同,并且Jenkins Pipeline对于复杂的管道在性能、可维护、复杂度管理等方面表现更加出色。
Pipeline Plugin是Jenkins初次启动时,推荐安装的插件之一。如果之前使用了默认安装,此时应该已经加载有Pipeline Plugin
Pipeline
,查看Pipeline pluginpipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building ...'
}
}
stage('Test') {
steps {
echo 'Testing ...'
}
}
stage('Deploy') {
steps {
echo 'Deploying ...'
}
}
}
}
block
)。Build
, Test
和Deploy
),可以包含多个步骤。New Item > Pipeline (name: pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "multi-steps pipeline"'
sh '''
echo "Hello World"
whoami
ls -l
'''
}
}
}
}
pipeline {
agent any
stages {
stage('Timeout') {
steps {
retry(3) {
sh 'timeout failure...'
}
}
}
}
}
pipeline {
agent any
stages {
stage('Deploy') {
steps {
retry(3) {
sh 'echo hello_world'
}
timeout(time: 3, unit: 'SECONDS') {
sh 'sleep 5'
}
}
}
}
}
pipeline {
agent any
environment {
NAME1 = 'Tom'
NAME2 = 'Jerry'
}
stages {
stage('Build') {
steps {
sh 'echo "Hello, $NAME1 and $NAME2"'
}
}
}
}
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'echo "test fail!"; exit 1'
}
}
}
post {
always {
echo 'always executed'
}
success {
echo 'executed if this test success'
}
failure {
echo 'executed if this test fails'
}
}
}
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'echo "test success!"'
}
}
}
post {
always {
echo 'always executed'
}
success {
echo 'executed if this test success'
}
failure {
echo 'executed if this test fails'
}
}
}
除了在Jenkins项目配置中写入Pipeline DSL, 还可以通过BlueOcean UI设置流水线项目。
Blue Ocean 重新思考Jenkins的用户体验,重新设计Jenkins Pipeline, 但与原有的Jenkins作业兼容,增加了新的特性:
但是BlueOcean暂时还不成熟,原有的Jenkins classic UI依然保留。需要以插件的形式安装BlueOcean
默认情况下不安装 BlueOcean Plugin,手动安装流程如下
blue ocean
,点击安装Dashboard左侧出现Open Blue Ocean
blueocean
,也选pulic在BlueOcean页面
http://10.0.0.215/jenkins/blueocean.git
进入UI配置界面,点击+
添加一个新的stage
echo "Hello World!"
点击 Show branches
构建成功会更新状态图标
点击查看pipeline
刷新一下BlueOcean的git repo。出现了一个Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World!"'
echo 'Hello BlueOcean'
}
}
}
}
回到BlueOcean的项目页面
Periodically if not otherwise run
BlueOcean会每隔1分钟去查看一下有没有新的代码更动,如果有会自动执行pipeline
通过Gitlab的Web IDE,新建一个静态页面,写入一些有bug的代码
index.html
doctype html>
<html>
<head>
<title>Static HTML Sitetitle>
head>
<body>
<p>This is a simple Static HTML site. There is no <strong>CSSstrong> or <strong>JavaScriptscript>.p>
body>
html>
安装tidy
sudo apt-get install -y tidy
在Jenkinsfile中,加入Lint检查
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World!"'
echo 'Hello BlueOcean'
}
}
stage('Lint HTML') {
steps {
sh 'tidy -q -e *.html'
}
}
}
}
BlueOcean 显示 Lint HTML 阶段失败,提示
line 7 column 83 - Warning: replacing unexpected script with
找到对应的代码,修改bug,并提交
等待1分钟,重试pipeline,Lint HTML 阶段成功
代码进入main branch
BlueOcean 显示了一个新的main branch构建
simple-java-maven-app 中也包含了一个Jenkinsfile,
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
}
}
安装Maven命令
sudo apt-get install -y maven
在BlueOcean页面
http://10.0.0.215/jenkins/maven.git
但是Jenkinsfile并不在默认路径上,所以需要进Configure页面修改
显示 Scan Multibranch Pipeline Log 成功,点击Open Blue Ocean
Start > Build > Test > Deliver > End 成功, 输出Hello World