什么是Pipeline
jenkins2相比jenkins引入了管道(Pipeline)、工作流的概念,管道是一个单独的概念,可以执行的一系列事件或作业。Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息以steps的方式放在一个脚本里,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程,形成流水式发布,构建步骤视图化。简单来说,Pipeline适用的场景更广泛,能胜任更复杂的发布流程。举个例子,job构建工作在master节点,自动化测试脚本在slave节点,这时候jenkins1.0就无法同时运行两个节点,而Pipeline可以
在这里,您应该看到两个熟悉的概念: Stage 和 Step 。
- 阶段:包含一系列步骤的块。 阶段块可以命名为任何名称; 它用于可视化管道过程。
- 步骤:说明要做什么的任务。 步骤在阶段块内定义。
通过编写papiline文件,定制化编写需要的工作流。
1. 构建项目
在构建jenkins项目之前,我先自定义了一个微服务eureka 注册中心,并经其上传我的gitlab仓库,以便我用来测试。如需参考:
搭建jenkins2参考:,我用是的war包启动的方式。
2. 编写pipeline文件
如下是我做的一个很简单的springcloud项目,依赖了eureka,启动后是一个eureka注册中心。然后在 eureka/docker 目录下定义了 pipeline.ci,在 jenkins 配置的脚本路径就指向这个文件。
如果是微服务项目。那每个服务下面都要定义一个该服务部署的流水化脚本。
现在我把项目上传到gitlab仓库就可以测试了,如下为我定义的4个发布阶段,简单输出了1,2,3,4。完成一下基本的流程测试。
3. 发布项目,success!
如下为发布后的控制台输出
4. 定义我的实际发布流程
首先看下目录结构,jenkins配置的项目是springcloud-jenkins,该项目下有个名为eureka的微服务。docker/ 目录下分别定义了jenkins启动脚本pipeline.ci,构建镜像脚本Dockerfile。
以下示例:eureka/docker/pipeline.ci
请注意:
- 以下steps里每一行执行的shell脚本,都是从jenkins配置的git项目的根目录开始的。
- 代码编译完成后,会将target目录下的jar,拷贝到和Dockerfile同级目录下。方便后续制作镜像
- 删除私服镜像、上传新镜像的步骤,都是操作Harbor私服。我这里只是想把Harbor引入进来,也可以去掉。感觉意义不大
- 还可以把docker-compose引入进来,在docker目录下继续构建docker-compose.yml,通过docker-compose build Dockerfile。运行容器时直接docker-compose up -d
pipeline {
// 用任何一个执行器均可
agent any
// 定义环境变量
environment {
workPath = './eureka'
host = '123.57.128.96'
version = '1.0'
appName = 'eureka'
port = '8761'
}
stages {
stage ('代码编译'){
steps {
sh 'cd ${workPath} && mvn clean package -U'
sh 'cd ${workPath} && cp ./target/*.jar ./docker/${appName}.jar'
echo 'show docker files: '
sh 'ls ${workPath}/docker'
}
}
# 根据容器运行名称删除
stage ('删除本地容器'){
steps {
sh 'docker stop ${appName}'
sh 'docker rm ${appName}'
}
}
stage ('删除本地镜像'){
steps {
// 强行删除镜像
sh 'docker rmi -f ${host}/dev/cloud/${appName}:${version}'
}
}
stage ('制作镜像'){
steps {
sh 'cd ${workPath}/docker/ && docker build -t ${host}/dev/cloud/${appName}:${version} .'
}
}
// 私服定义的项目目录为:/dev/cloud/eureka
stage ('删除私服镜像'){
steps {
sh "curl -u 'admin:Harbor12345' -X DELETE -H 'Content-Type:application/json' 'http://${host}/api/repositories/dev/cloud/${appName}/tags/${version}'"
}
}
stage ('上传新镜像'){
steps {
sh 'docker push ${host}/dev/cloud/${appName}:${version}'
}
}
stage ('运行容器'){
steps {
sh 'docker run -d -p ${port}:${port} --name ${appName} ${host}/dev/cloud/${appName}:${version}'
}
}
}
}
以下示例:eureka/docker/Dockerfile
FROM java:8
MAINTAINER jjp
ADD eureka.jar /usr/local/eureka.jar
ENTRYPOINT ["java","-jar","/usr/local/eureka.jar"]
5.看下实际发布流程,展示效果
打开http://ali:8761/,我的注册中心是否已经启动成功。