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

  1. Jenkinsfile (Scripted Pipeline)
  2.  
  3. node {
  4. stage('Build') {
  5. //
  6. }
  7. stage('Test') {
  8. //
  9. }
  10. stage('Deploy') {
  11. //
  12. }
  13. }

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

如下简单介绍下现有的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. FROM frolvlad/alpine-oraclejdk8:slim
  9. WORKDIR /home/
  10. ENV LC_ALL=en_US.UTF-8\
  11. LANG=en_US.UTF-8\
  12. JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom "
  13.  
  14. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  15. RUN apk add --no-cache tzdata \
  16. && ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime \
  17. && echo "Asia/Chongqing" > /etc/timezone \
  18. &&rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache ## 清除缓存
  19.  
  20. COPY --from=builder /build/target/x.jar /home/app.jar
  21. EXPOSE 19090
  22. ENTRYPOINT [ "sh", "-c", "java -server -Xms2048m -Xmx2048m $JAVA_OPTS -jar app.jar --spring.profiles.active=test" ]

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

  1. node('xx-jnlp'){
  2. def DockerTestImage = ''
  3. def DockerProductImage = ''
  4. def REPOSITORY = 'imagename'
  5.  
  6. stage('clone git'){
  7. echo "BRANCH IS :${BRANCH}"
  8. checkout([$class: 'GitSCM', branches: [[name: "${BRANCH}"]],
  9. userRemoteConfigs: [[url: 'git@x.x.x.x:java/x.git',credentialsId:'xxxxxxxxxxxxxxxx']]
  10. ])
  11. echo "hello ${DockerTestImage}"
  12. echo "hello ${BRANCH}"
  13. }
  14.  
  15. stage('init'){
  16. script {
  17.  
  18. build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
  19. GIT_COMMIT=sh(script:"echo ${build_tag} | cut -c 1-8", returnStdout:true).trim()
  20. LOCALDATE=sh(script:"date '+%F'",returnStdout:true).trim()
  21. VERSION = "V1-${LOCALDATE}-${GIT_COMMIT}"
  22. }
  23. }
  24. stage('Build master') {
  25. if (env.BRANCH_NAME == 'master'){
  26. echo "3.Build Docker Image Stage for master"
  27. sh "ls -l /root/.m2"
  28. echo "ls -l /root/.m2"
  29. sh "cp /root/.m2/settings.xml /root/.m2/repository . -rfp"
  30. sh "docker build -f Dockerfile_product_k8s -t ${REPOSITORY} . "
  31.  
  32. }
  33. }
  34. stage('Build test'){
  35. if (env.BRANCH_NAME != 'master'){
  36. echo "3.Build Docker Image Stage for test"
  37. sh "ls -l /root/.m2"
  38. echo "ls -l /root/.m2"
  39. sh "cp /root/.m2/settings.xml /root/.m2/repository . -rfp"
  40. sh "docker build -f Dockerfile_test_k8s -t ${REPOSITORY} . "
  41. }
  42. }
  43. stage('Push to master') {
  44. if(env.BRANCH_NAME == 'master'){
  45. echo "4.Push Docker Image master Stage"
  46. withCredentials([usernamePassword(credentialsId: 'registry.cn-hangzhou.aliyuncs.com', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]){
  47. sh "docker login --username=${dockerHubUser} --password=${dockerHubPassword} registry.cn-hangzhou.aliyuncs.com"
  48. sh "docker tag ${REPOSITORY} ${DockerProductImage}:${VERSION}"
  49. sh "docker push ${DockerProductImage}:${VERSION}"
  50.  
  51. }
  52.  
  53. }
  54. }
  55.  
  56. stage('Push to test'){
  57. if(env.BRANCH_NAME != 'master'){
  58. echo "4.Push Docker Image test Stage"
  59. withCredentials([usernamePassword(credentialsId: 'registry.cn-hangzhou.aliyuncs.com', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]){
  60. sh "docker login --username=${dockerHubUser} --password=${dockerHubPassword} registry.cn-hangzhou.aliyuncs.com"
  61. sh "docker tag ${REPOSITORY} ${DockerTestImage}:${VERSION}"
  62. sh "docker tag ${REPOSITORY} ${DockerTestImage}:latest"
  63. sh "docker push ${DockerTestImage}:${VERSION}"
  64.  
  65. }
  66. }
  67. }
  68. stage('YAML') {
  69. echo "5. Change YAML File Stage"
  70.  
  71. }
  72. stage('Deploy') {
  73.  
  74. echo "6. Deploy Stage"
  75. }
  76.  
  77. }

说明:

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的多步编译,会好些。但是每次编译都会下载网络依赖,会耗时比较久。

通过pipeline实现jenkins的ci/cd功能的更多相关文章

  1. Jenkins 配置CI/CD任务

    本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上. 如果是初始尝试实践,可能需要参考 快速搭建云原生架构的实践环境 和 Jhipster技 ...

  2. 使用 Jenkins 搭建 CI/CD All In One

    使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...

  3. 使用Docker方式部署Gitlab,Gitlab-Runner并使用Gitlab提供的CI/CD功能自动化构建SpringBoot项目

    1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runner,地址: ...

  4. 使用Gitlab的CI/CD功能自动化推送docker镜像到Nexus仓库出现的问题

    在服务器中可以直接使用命令行登录,推送docker镜像等 但是在使用Gitlab的CI/CD功能中,gitlab-ci.yml文件执行过程中出现如下错误: 原因分析: 服务器上之前使用命令行登陆过Ne ...

  5. Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

  6. Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

  7. Jenkins自动化CI CD流水线之1--介绍与安装

    第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...

  8. Jenkins自动化CI&CD流水线

    1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...

  9. .Net在Windows上使用Jenkins做CI/CD的那些事

    背景 最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD. 本篇的重点主要分享 ...

随机推荐

  1. nginx的部署及配置文件的介绍 域名 用户认证 SSL加密模块

    步骤一:构建Nginx服务器 yum -y install gcc pcre-devel openssl-devel        #安装依赖包 wget   http://nginx.org/dow ...

  2. JavaScript的函数申明、函数表达式、箭头函数

    JavaScript中的函数可以通过几种方式创建,如下. // 函数声明 function getName() { return 'Michael' } // 函数表达式 const getName ...

  3. HDU1079 Calender Game

    Adam and Eve enter this year’s ACM International Collegiate Programming Contest. Last night, they pl ...

  4. 2017 ACM/ICPC 沈阳 K题 Rabbits

    Here N (N ≥ 3) rabbits are playing by the river. They are playing on a number line, each occupying a ...

  5. PyCharm配置Gitee

    PyCharm配置Gitee 第一步:下载安装Git https://git-scm.com/download/win 第二步:打开PyCharm,配置Git File->Setting-> ...

  6. 人生苦短,我用Python(1)

    1.Python保留字与标识符 保留字是Python语言中一些已经被赋予特定意义的单词,开发程序时,不可以把这些保留字作为变量.函数.类.模块和其他对象的名称来使用. and as assert br ...

  7. Bootstrap模板-Amaretti.2.6.2

    密罐地址: 点我下载

  8. [ASP.NET Core 3框架揭秘] 依赖注入[7]:服务消费

    包含服务注册信息的IServiceCollection集合最终被用来创建作为依赖注入容器的IServiceProvider对象.当需要消费某个服务实例的时候,我们只需要指定服务类型调用IService ...

  9. 物联网基础组件IoTClient开发系列

    系列目录 IoTClient开发1 - 你也可以写个聊天程序 IoTClient开发2 - 你也可以写个服务器 IoTClient开发3 - ModBusTcp协议客户端实现 IoTClient开发4 ...

  10. CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现

    CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现 参考文章1 参考文章2 By:Mirror王宇阳 漏洞原理 攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞. ...