通过pipeline实现jenkins的ci/cd功能
pipeline是基于groove进行实现的,不过从jenkins官方的说明中,pipeline分为脚本式和声明式,参见链接。经过对两种的比较,个人比较偏向脚本式的方法。也就是
Jenkinsfile (Scripted Pipeline)
node {
    stage('Build') {
        //
    }
    stage('Test') {
        //
    }
    stage('Deploy') {
        //
    }
}
因为声明式的方法用起来不方便,还有就是语句执行的结果不知道怎么赋值到变量中去。
如下简单介绍下现有的jenkinsfile,由于能力有限,如有错误,请指正。
1.由于是部署的spring-cloud的项目,会依赖maven环境,所以使用了dockerfile的多步编译。
FROM maven:3-alpine as builder
ADD . /build/
WORKDIR /build
COPY ./settings.xml /root/.m2/
COPY ./repository /root/.m2/
RUN mvn -DskipTests clean install package -q -U -Ppro FROM frolvlad/alpine-oraclejdk8:slim
WORKDIR /home/
ENV LC_ALL=en_US.UTF-8\
LANG=en_US.UTF-8\
JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom " RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime \
&& echo "Asia/Chongqing" > /etc/timezone \
&&rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache ## 清除缓存 COPY --from=builder /build/target/x.jar /home/app.jar
EXPOSE 19090
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的多步编译,会好些。但是每次编译都会下载网络依赖,会耗时比较久。
通过pipeline实现jenkins的ci/cd功能的更多相关文章
- Jenkins 配置CI/CD任务
		
本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上. 如果是初始尝试实践,可能需要参考 快速搭建云原生架构的实践环境 和 Jhipster技 ...
 - 使用 Jenkins 搭建 CI/CD All In One
		
使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...
 - 使用Docker方式部署Gitlab,Gitlab-Runner并使用Gitlab提供的CI/CD功能自动化构建SpringBoot项目
		
1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runner,地址: ...
 - 使用Gitlab的CI/CD功能自动化推送docker镜像到Nexus仓库出现的问题
		
在服务器中可以直接使用命令行登录,推送docker镜像等 但是在使用Gitlab的CI/CD功能中,gitlab-ci.yml文件执行过程中出现如下错误: 原因分析: 服务器上之前使用命令行登陆过Ne ...
 - Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能
		
上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...
 - Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能
		
上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...
 - Jenkins自动化CI CD流水线之1--介绍与安装
		
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
 - Jenkins自动化CI&CD流水线
		
1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...
 - .Net在Windows上使用Jenkins做CI/CD的那些事
		
背景 最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD. 本篇的重点主要分享 ...
 
随机推荐
- use dict in bash
			
declare -A animals=(["moo"]="cow" ["woof"]="dog") for sound ...
 - GROUP_CONCAT在组合商品中的使用
			
表:combined_product_item -------------------------pid sku quality-------------------------1 sku1 11 s ...
 - 洛谷 P3420 [POI2005]SKA-Piggy Banks 题解
			
蒟蒻的第二篇题解 嗯,直接进入正题 先告诉你们这是并查集,好吧,标签上面有,再来分析这为什么是并查集. 根据题意: 每一个存钱罐能够用相应的钥匙打开或者被砸开,Byteazar已经将钥匙放入到一些存钱 ...
 - mininet(三)简单的NAT实验
			
mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 本次实验拓扑图如下: 假设 Openvswitch switch1是一个带有NAT功能的路由 ...
 - 第一节:Shiro HelloWorld 实现
			
1.新建maven工程,pom配置maven jar包 <dependency> <groupId>org.apache.shiro</groupId> <a ...
 - Tesseract-OCR 字体库下载地址
			
https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
 - 【CuteJavaScript】Angular6入门项目(3.编写服务和引入RxJS)
			
本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...
 - rails 5 功能新增及改变
			
1.ApplicationRecord 在Rails4中所有的模型都继承自ActiveRecord::Base,不过在Rails5中新引进了一个叫ApplicationRecord的类,存放在: ap ...
 - 【Element UI】使用问题记录
			
[Element UI]使用问题记录 转载:https://www.cnblogs.com/yangchongxing/p/10750994.html 下载地址: https://unpkg.com/ ...
 - Intent知识详解
			
Intent知识详解 一.什么是Intent 贴一个官方解释: An intent is an abstract description of an operation to be performed ...