Jenkins Pipeline(以下称“管道”)是一套插件,使jenkins支持建立持续交付工作流,将自由式的构建工作连接起来执行连续性任务。
为什么要管道?Jenkins从根本上说是一个支持多种自动化模式的自动化引擎。Pipeline在Jenkins上增加了一套强大的自动化工具,支持从简单的CI持续集成到全面的CD工作流的用例,使jenkins完成从CI到CD角色的转变。通过对一系列相关任务建模,可以利用Pipeline的许多功能:
- 代码:管道是在代码中实现的,可以被检入到源代码管理中,使整个团队能够编辑、审查和迭代他们的交付流程。
- 耐久性:通过版本管理,保护工作流代码不易丢失,。
- 交互性:管道可以前台进行交互,让执行者决定是否继续。
- 多用途:管道支持复杂的实际CD需求,包括分支/连接,循环和并行执行工作的能力。
- 可扩展性:Pipeline插件支持对其DSL的定制扩展 和jenkins其他插件集成的选项。
Node
节点是Jenkins运行工作空间,即jenkins分配的执行工作的机器。
stage
管道工作流运行的阶段,如拉取代码,单元测试,性能测试,编译,部署等。
step
一项任务,一个步骤。在stage阶段中,要执行的步骤。
语法简介jenkins pipeline支持两种语法:
- Declarative Pipeline 声明式管道
Scripted Pipeline 脚本式管道
Declarative Pipeline
pipeline
pipeline {
agent any //在任何jenkins节点上都可运行
stages {
stage('Build') { // buid 阶段
steps { //build 步骤
}
}
stage('Test') { // test 阶段
steps {
//
}
}
stage('Deploy') { // 部署 阶段
steps {
//
}
}
}
}
Scripted Pipeline
node
node {
stage('Build') {
input
sh
git
checkout
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
input
交互命令,可暂停工作流运行,等待执行者的输入信息,由人为去决定何时继续下一步工作
sh
执行shell命令
git
从gitSCM仓库检出
chekout
支持多种SCM检出,git,svn等
更多详细语法查询: http://本地jenkins:端口/pipeline-syntax/
开始第一个Pipeline应用创建pipeline有两种方式:
- Blue Ocean 界面非常常亮
- 经典界面 可直接在界面编写jenkinsfile
以下使用经典界面创建pipeline。
新建任务
- 点击— “新建任务”
- 选择— “流水线”类型,并输出任务名称,保存
pipeline编写:Golang Docker
env.PROJ_DIR='src/learningGo'
node {
withEnv(["GOPATH=$WORKSPACE"]) { // 设置stage运行时的环境变量
stage('Init gopath') {
sh 'mkdir -p $GOPATH/{bin,pkg,src}' // go运行环境目录
}
stage('Get code') {
checkout([ // git repo
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'src/learningGo']],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: '3d33494a-ee1a-4540-a5e9-27f068a2b859',
url: 'git@github.com:peng0208/learningGo.git'
]]
])
}
stage('Build go proejct') {
sh 'cd ${PROJ_DIR}/daemon/example; go test && go build && go install'
}
stage('Deploy to test') { // 部署测试环境
input message: 'deploy to test ?', ok: 'De'
echo 'docker run'
}
stage('Deploy to qa') { // 部署预发布环境
input message: 'deploy to qa ?', ok: 'OK!'
echo 'docker run'
}
stage('Deploy to production') { // 部署生产环境
input message: 'deploy to production ?', ok: 'OK!'
echo 'docker run'
}
}
}
构建流程简述:
初始化GOPATH。
Go项目的编译及安装都在GOPATH下进行,而实际开发中不同go项目的依赖版本及依赖包可能会不同,系统中有多版本共存的情况。为了防止版本冲突,最好针对每个项目都提供单独的GOPATH。因为我采用的方法是,把当前jenkins job的工作目录设置为GOPATH,隔离每个项目的go运行空间。
从SCM拉取项目代码,检出到GOPATH/src/project_name 目录。
进入GOPATH/src/project_name 项目目录,进行单元测试、编译、安装等操作。
编译完成后,将二进制程序打包入docker镜像,推送至docker registry。
使用新的镜像部署测试=>预发布=>生产环境。
构建运行
图中展示了整个构建流程由多个连续的阶段组成,能够明确的看到每一步的工作完成情况。
当构建到deploy test时,可以看到界面会弹出确认信息“deploy to test ?”,需要点击OK才可继续。
总结Pipeline将代码获取、单元测试、性能测试、静态检查、打包部署等研发测试部署环节,通过流水线工作集成,全面做到持续交付,简单强大。