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功能的更多相关文章

  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. Cisco 7200 路由 PPPOE 拨号详解

    1.1配置虚拟拨号接口 R1(config)#vpdn enable                  #启用vpdn虚拟专用拨号网络 R1(config)#interface dialer 1    ...

  2. 使用node.js将xmind导出的excel转换为json树

    xmind文件如图所示, 最终生成的数据结构如图  2,选择导出为excel文件,导出的excel文件打开如图 3,安装node读取excel模块 cnpm i  node-xlsx --save 4 ...

  3. php mysql_connect 在同一host下多数据库mysql_select_db()的bug .

    操作方法 创建两个数据库test1 test2 同一个host下面 分别在两个数据库中创建表 -- ---------------------------- -- Table structure fo ...

  4. 【原创】(十三)Linux内存管理之vma/malloc/mmap

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. [TimLinux] systemd 精通CentOS7系统启动systemd

    1. 介绍 systemd: 在12种不同类型的实体单元(entity unit)间提供了一个依赖关系系统. 2. 几个概念 实体单元:为系统的启动和维护封装多种对象(object).主体单元在单元配 ...

  6. 解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)

    做了3天的win10的兼容性测试,大部分时间都卡权限获取这了. 以下废话很多,想直接找解决方法,请跳至红字 首先,简单说下uac,自vista后windows再次加严了权限管理,uac (账户控制) ...

  7. Vue项目中实现用户登录及token验证

    学习博客:https://www.cnblogs.com/web-record/p/9876916.html

  8. centos7—计划任务(at、cron)

    centos7—计划任务(at.cron) 2018-08-08 14:33:17 coisini_覔 阅读数 3751更多 分类专栏: Linux基础 crond/at   版权声明:本文为博主原创 ...

  9. Java中“附近的人”实现方案讨论及代码实现

    前言 在我们平时使用的许多app中有附近的人这一功能,像微信.qq附近的人,哈罗.街兔附近的车辆.这些功能就在我们日常生活中出现. 像类似于附近的人这一类业务,在Java中是如何实现的呢? 本文就简单 ...

  10. SpringBoot电商项目实战 — ElasticSearch接入实现

    如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...