jenkins的pipeline

Jenkins Pipeline的总体介绍

Jenkins Pipeline 的核心概念:

Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变

Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。

持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。

Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code(Jenkinsfile存储在项目的源代码库)的目的。

1
2
3
4
5
6
7
Stage:阶段,一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。

注意,Stage是一个逻辑分组的概念,可以跨多个Node

Node:节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。

Step:步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’

Pipeline五大特性

1
2
3
4
5
6
7
8
9
代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑、审查和迭代其CD流程。

可持续性:Jenklins重启或者中断后都不会影响Pipeline Job。

停顿:Pipeline可以选择停止并等待任工输入或批准,然后再继续Pipeline运行。

多功能:Pipeline支持现实世界的复杂CD要求,包括fork/join子进程,循环和并行执行工作的能力

可扩展:Pipeline插件支持其DSL的自定义扩展以及与其他插件集成的多个选项。

简单的pipeline

新建 Job:在 Web UI 中点击 New Item -> 输入名称:pipeline-demo -> 选择下面的 Pipeline -> 点击 OK

配置:在最下方的 Pipeline 区域输入如下 Script 脚本,然后点击保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
node('jnlp') {
stage('Clone') {
echo "1.Clone Stage"
}
stage('Test') {
echo "2.Test Stage"
}
stage('Build') {
echo "3.Build Stage"
}
stage('Deploy') {
echo "4. Deploy Stage"
}
}

构建:点击左侧区域的 Build Now,可以看到 Job 开始构建了

命令行可以看到:

1
2
3
4
5
6
7
8
9
[root@node1 jenkins2]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 309 12d
jenkins2-5f76f7f8b5-hzcqw 1/1 Running 0 16h
jnlp-gd6wz 1/1 Running 0 69s
[root@node1 jenkins2]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 309 12d
jenkins2-5f76f7f8b5-hzcqw 1/1 Running 0 16h

简单golang服务pipeline

  • 第一步,clone 代码
  • 第二步,进行测试,如果测试通过了才继续下面的任务
  • 第三步,由于 Dockerfile 基本上都是放入源码中进行管理的,所以我们这里就是直接构建 Docker 镜像了
  • 第四步,镜像打包完成,推送到镜像仓库
  • 第五步,镜像推送完成,更改 YAML 文件中的镜像 TAG 为这次镜像的 TAG
  • 第六步,使用 kubectl 命令行工具进行部署了

script脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
node('jnlp') {
stage('Clone') {
echo "1.Clone Stage"
git url: "https://github.com/shenshengkun/jenkins-demo.git"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
stage('Test') {
echo "2.Test Stage"
}
stage('Build') {
echo "3.Build Docker Image Stage"
sh "docker build -t registry.gag.cn/private/sy:${build_tag} ."
}
stage('Push') {
echo "4.Push Docker Image Stage"
sh "docker push registry.gag.cn/private/sy:${build_tag}"
}
stage('Deploy') {
echo "5. Deploy Stage"
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml"
sh "kubectl apply -f k8s.yaml --record --validate=false"
}
}

build now:

Stage View 界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@node1 jenkins]# kubectl get pods                
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 313 13d
jenkins2-5f76f7f8b5-hzcqw 1/1 Running 0 19h
jnlp-p6b1b 1/1 Running 0 3m39s
[root@node1 jenkins]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gag.cn/private/sy c4af501 6c1eb660f5b7 11 seconds ago 258MB



[root@node1 jenkins]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 313 13d
jenkins-demo-c44c8d468-tnrxs 0/1 CrashLoopBackOff 1 11s
jenkins2-5f76f7f8b5-hzcqw 1/1 Running 0 19h
jnlp-p6b1b 1/1 Running 0 7m42s
[root@node1 jenkins]# kubectl logs -f jenkins-demo-c44c8d468-tnrxs
Hello, sy!I'm from Jenkins CI!


[root@node1 jenkins]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 313 13d
jenkins-demo-c44c8d468-tnrxs 0/1 CrashLoopBackOff 2 41s
jenkins2-5f76f7f8b5-hzcqw 1/1 Running 0 19h
Donate