pipeline是基于groove进行实现的,不过从jenkins官方的说明中,pipeline分为脚本式和声明式,参见链接。经过对两种的比较,个人比较偏向脚本式的方法。也就是

Jenkinsfile (Scripted Pipeline)node {  stage('Build') { // }stage('Test') { // }stage('Deploy') { // }
}

因为声明式的方法用起来不方便,还有就是语句执行的结果不知道怎么赋值到变量中去。

如下简单介绍下现有的jenkinsfile,由于能力有限,如有错误,请指正。

1.由于是部署的spring-cloud的项目,会依赖maven环境,所以使用了dockerfile的多步编译。

 1 FROM maven:3-alpine as builder
 2 ADD . /build/
 3 WORKDIR /build
 4 COPY ./settings.xml   /root/.m2/
 5 COPY ./repository   /root/.m2/
 6 RUN   mvn  -DskipTests clean install package -q -U -Ppro
 7
 8
 9
10 FROM frolvlad/alpine-oraclejdk8:slim
11 WORKDIR /home/
12 ENV LC_ALL=en_US.UTF-8\
13     LANG=en_US.UTF-8\
14     JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom "
15
16 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
17 RUN apk add --no-cache tzdata \
18     && ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime \
19     && echo "Asia/Chongqing" > /etc/timezone \
20     &&rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache ## 清除缓存
21
22
23 COPY --from=builder /build/target/x.jar /home/app.jar
24 EXPOSE 19090
25 ENTRYPOINT [ "sh", "-c", "java -server -Xms2048m -Xmx2048m $JAVA_OPTS -jar app.jar --spring.profiles.active=test" ]

多步编译完成之后,编写pipeline文件

node('xx-jnlp'){def  DockerTestImage = ''def  DockerProductImage = ''def  REPOSITORY = 'imagename'stage('clone git'){echo "BRANCH IS :${BRANCH}"checkout([$class: 'GitSCM', branches: [[name: "${BRANCH}"]],userRemoteConfigs: [[url: 'git@x.x.x.x:java/x.git',credentialsId:'xxxxxxxxxxxxxxxx']]])echo "hello ${DockerTestImage}"echo "hello ${BRANCH}"}stage('init'){script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()GIT_COMMIT=sh(script:"echo ${build_tag} | cut -c 1-8", returnStdout:true).trim()LOCALDATE=sh(script:"date '+%F'",returnStdout:true).trim()VERSION = "V1-${LOCALDATE}-${GIT_COMMIT}"}}stage('Build master') {if (env.BRANCH_NAME == 'master'){echo "3.Build Docker Image Stage for master"sh "ls -l /root/.m2"echo "ls -l /root/.m2"sh "cp /root/.m2/settings.xml /root/.m2/repository . -rfp"sh "docker build -f Dockerfile_product_k8s -t ${REPOSITORY} . "}}stage('Build test'){if (env.BRANCH_NAME != 'master'){echo "3.Build Docker Image Stage for test"sh "ls -l /root/.m2"echo "ls -l /root/.m2"sh "cp /root/.m2/settings.xml /root/.m2/repository . -rfp"sh "docker build -f Dockerfile_test_k8s -t ${REPOSITORY}  . "}}stage('Push to master') {if(env.BRANCH_NAME == 'master'){echo "4.Push Docker Image master Stage"withCredentials([usernamePassword(credentialsId: 'registry.cn-hangzhou.aliyuncs.com', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]){sh "docker login --username=${dockerHubUser} --password=${dockerHubPassword} registry.cn-hangzhou.aliyuncs.com"sh "docker tag  ${REPOSITORY}  ${DockerProductImage}:${VERSION}"sh "docker push  ${DockerProductImage}:${VERSION}"}}}stage('Push to test'){if(env.BRANCH_NAME != 'master'){echo "4.Push Docker Image test Stage"withCredentials([usernamePassword(credentialsId: 'registry.cn-hangzhou.aliyuncs.com', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]){sh "docker login --username=${dockerHubUser} --password=${dockerHubPassword} registry.cn-hangzhou.aliyuncs.com"sh "docker tag  ${REPOSITORY}  ${DockerTestImage}:${VERSION}"sh "docker tag  ${REPOSITORY}  ${DockerTestImage}:latest"sh "docker push  ${DockerTestImage}:${VERSION}"}}}stage('YAML') {echo "5. Change YAML File Stage"}stage('Deploy') {echo "6. Deploy Stage"}}

说明:

1、node后面指定的是k8s slave节点的tag名称,当运行此任务时k8s会新建节点,在此节点上运行节点,并执行dockerfile,完成打包和生成镜像的功能。

2、git clone stage是复制代码到slave节点

3、init stage 初始化变量

4、build stage根据不同的代码分支执行不同的创建命令步骤,并完成不同的镜像文件创建

5、push stage将创建好的镜像推送到服务器上。

6、发布的命令暂时使用的阿里云的触发器来实现的。

如上。

遇到过的坑。

1、如果使用声明式的流水线,会发现bash变量的值不是太好赋值到变量中,而只能使用parameter实现,不能满足要求。后面忍痛切换到node方式。

2、由于node和pipeline用法上有很多区别,所以切换的时候注意小心小心。

3、由于docker的编译环境和镜像生成环境是使用不同的镜像,所以生成后的jar包如果不使用多步编译只能stash到生成镜像的docker镜像中,会比较麻烦。目前使用的dockerfile的多步编译,会好些。但是每次编译都会下载网络依赖,会耗时比较久。

转载于:https://www.cnblogs.com/chrrydot/p/10811583.html

通过pipeline实现jenkins的ci/cd功能相关推荐

  1. 还在用Jenkins?试试Gitlab的CI/CD功能吧,贼带劲!

    前言 Docker和Spring Boot是非常流行的组合,我们将利用GitLab CI的优势,并在应用程序服务器上自动构建,推送和运行Docker镜像. GitLab CI Gitlab CI/CD ...

  2. 使用 jenkins 构建 CI/CD 平台

    CI/CD 概述 大概了解一下 CI/CD 是啥子,其实之前做过这东西,但是没解释过. 持续集成 (Continuous Integration,CI) :代码合并构建部署测试都在一起,不断地执行这个 ...

  3. Gitlab+Jenkins+Artifactory, CI/CD自动构建发布环境搭建使用实践

    CI/CD自动构建发布环境搭建使用实践 通过C/C++的cmake工程示例项目,构建Gitlab+Jenkins+Artifactory自动构建发布环境.其中 Gitlab提供源码仓库功能,通过web ...

  4. Jenkins 构建CI/CD(一看就会)

    文章目录 一.CI / CD 1.概念 2.CI / CD 方法简介 二.jenkins介绍 1.Jenkins概述 2.Jenkins目标 3.Jenkins特性 4.产品发布流程 三.部署应用Je ...

  5. 服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建

    感兴趣的话大家可以关注一下公众号 : 猿人刘先生 , 欢迎大家一起学习 , 一起进步 , 一起来交流吧! 1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的 ...

  6. Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目

    一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...

  7. Spring Cloud 项目实战 Jenkins 实现 CI/CD 你需要的这里都有

    1. Jenkins 介绍 在介绍 Jenkins 之前首先了解一个概念 CI,也就是持续集成.持续集成是一种开发实践,即团队开发成员经常集成他们的工作,每次集成后都通过自动化构建服务来验证,从而尽快 ...

  8. OpenShift 4 Hands-on Lab (8) 基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在 OpenShift 4.8 环境中验证(OpenShift 4.9 环境的 Jenkins 版本较新,编译 Java 报错 ...

  9. OpenShift 4之实现一个基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline

    OpenShift 4之实现一个基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline 场景说明 运行环境 配置操作过程 准备运行所需资源 配置Gogs并导入应用代 ...

最新文章

  1. 西南科技大学智能车竞赛 线上比赛
  2. Tiny210编译和烧写u-boot步骤
  3. linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动
  4. RabbitMQ中7种消息队列和保姆级代码演示!
  5. Linux负载均衡软件LVS(概念篇)
  6. oncreate 测量尺寸
  7. SANGFOR SCSA——网络基础
  8. 干货培训 | 使用OBS进行直播导播和推流(下篇)
  9. 【离散数学】求闭包的例题
  10. python kdj指标详解_Python版简单的KDJ策略
  11. 服务产品(商品)评论中的产品特征挖掘方法
  12. A。资源库和运行时表结构(5)---JBPM4.4数据库表解释
  13. 路由器与交换机的基本工作原理
  14. 微信会员卡 java请求_会员系统对接微信会员卡的好处
  15. 计算机图形学入门(十三)-光线追踪(基本原理)
  16. 动态规划java实现数塔问题_动态规划入门_数塔问题
  17. eclipse如何汉化--安装各国语言包
  18. 彩灯控制单片c语言程序,基于51单片机的led彩灯设计。 9个灯(红绿蓝三色)。按键控制 c语言程序...
  19. python 分班_按成绩分班
  20. 会定时提醒的贴心提示板之核心语音芯片(WT588F02B)和闹钟部件

热门文章

  1. TM、XWT和Wazaabi
  2. 周末话题-元编程(metaprogramming)
  3. The alias LM/W3SVC/1/Root/XX already exists. Please choose a different alias
  4. 用python绘制柱状图标题-Python数据可视化:5种绘制柱状图表的方法(附源码)...
  5. 用python画梵高星空-python 梵高
  6. python资料免费-python 资料
  7. 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势
  8. python与excel的应用-Python利用pandas处理Excel数据的应用
  9. python代码案例详解-我用Python抓取了7000 多本电子书案例详解
  10. python小游戏源码-python 像素小鸟小游戏源码(flappybird)