热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Jenkinspipeline流水线构建docker镜像和发布

新建一个pipelinejob选择Pipeline任务,然后进入配置页面。对于Pipeline,Definition选择PipelinescriptfromSCM.需要注意的是



新建一个pipeline job


选择Pipeline任务,然后进入配置页面。


对于Pipeline, Definition选择 "Pipeline script from SCM".



需要注意的是Script Path, 这里要指定项目中Jenkinsfile文件的具体位置。默认是根目录。我这里是maven的一个子模块,所以嵌套一层。


项目中添加Jenkinsfile


关于Jenkinsfile可以查阅w3c翻译整理的文档: https://www.w3cschool.cn/jenkins/jenkins-qc8a28op.html


以下是我自己的Jenkinsfile,这里用作注释和备忘


node('slave001') {
stage('Prepare') {
echo "1.Prepare Stage"
checkout scm
pom = readMavenPom file: 'location/pom.xml'
docker_host = "docker.ryan-miao.com"
img_name = "${pom.groupId}-${pom.artifactId}"
docker_img_name = "${docker_host}/${img_name}"
echo "group: ${pom.groupId}, artifactId: ${pom.artifactId}, version: ${pom.version}"
echo "docker-img-name: ${docker_img_name}"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
if (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != null) {
build_tag = "${env.BRANCH_NAME}-${build_tag}"
}
}
}
stage('Test') {
echo "2.Test Stage"
sh "mvn test"
}
stage('Build') {
echo "3.Build Docker Image Stage"
sh "mvn package -Dmaven.test.skip=true"
sh "docker build -t ${docker_img_name}:${build_tag} " +
" --build-arg SPRING_PROFILE=prod " +
" --build-arg JAR_FILE=target/${pom.artifactId}-${pom.version}.jar " +
" ./location/"
}
stage('Push') {
echo "4.Deploy jar and Push Docker Image Stage"
sh "mvn deploy -Dmaven.test.skip=true"
sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:latest"
sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:${pom.version}"
withCredentials([usernamePassword(credentialsId: 'docker-register', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
sh "docker login -u ${dockerUser} -p ${dockerPassword} docker.ryan-miao.com"
sh "docker push ${docker_img_name}:latest"
sh "docker push ${docker_img_name}:${pom.version}"
sh "docker push ${docker_img_name}:${build_tag}"
}
}
//stash 'complete-build'
}
if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == null) {
timeout(time: 10, unit: 'MINUTES') {
input '确认要部署线上环境吗?'
}
}
node('slave001'){
stage('Deploy') {
//unstash 'complete-build'
echo "5. Deploy Stage"
sh "sed -i 's//${img_name}:${build_tag}/' location/k8s.yaml"
sh "sed -i 's//${env.BRANCH_NAME}/' location/k8s.yaml"
sh "/data/opt/kubernetes/client/bin/kubectl apply -f ${WORKSPACE}/location/k8s.yaml --record"
}
}


  • node('slave001') { 最外层必须是node节点,这里单独制定运行的jenkins节点,通常不用指定,由jenkins master分配任务即可。这种写法属于Scripted Pipeline。

  • stage('Prepare') {} stage是一个阶段的语法,括号里阶段名称。脚本从node开始,按顺序向下执行。遇到的第一个stage就是第一个阶段。

  • 使用 echo xxxx 来输出文字,给出进度信息。

  • checkout scm 是Jenkins固定获取代码的方法,会输出Check out from version control。

  • pom = readMavenPom file: 'location/pom.xml' 是读取workspace下相对目录的pom文件。这个需要Jenkins 安装 Pipeline Utility Steps 插件。通过 ${pom.groupId}-${pom.artifactId} 来获取pom信息. 我的pom在子module location里。

  • docker_host = "docker.ryan-miao.com" 声明一个全局的变量,如果只想在方法体 {} 中使用,可以加 def

  • ${docker_host} 变量可以通过这样类似shell的方式获取。

  • build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() 用来获取git的commit id

  • Build阶段执行docker命令打包,把我们的变量传递到Dockerfile. 我的Dockerfile同样在子module location下。

  • withCredentials 可以调用存储在Jenkins里的凭证。这个需要安装 Credentials Binding Plugin .

  • input 会产生一个交互式的按钮,需要手动点击通过才会继续,否则暂停。这个只是暂停下一步,线程还在运行。所以,需要单独提出node之外,再添加一个超时设置。参见 “input” step blocks executor

  • stash 暂存文件,参见 官方文档 . 主要用来把这次build过程中的某个文件给暂存,只在本次build有效。本次不需要。

  • timeout 主要用来设置超时,参见 官方文档 , 时间单位有: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS 。这里等待用户确认是否继续,若超过10分钟还没有确认,则停止。


看起来,似乎完美的从代码编译,打包,构建docker镜像,推送到仓库,设置触发了部署。但离真正生产方案还有距离。因为你不可能编译结束就直接上生产。真实的流程应该是: checkout->build->test-> 部署到测试环境 -> 对测试环境的自动化测试 -> 部署到生产环境。


如何做到build once, deploy many


我这里的pipeline步骤里没有多环境串联部署。这里部署到测试环境了,如果测试通过之后,想要部署生产环境应该怎么下一步呢?想要手动点一下某个按钮,就可以将部署在测试环境的这个版本的镜像部署到prod。input显然不满足需求。


第一,记录当前测试环境的镜像id;第二,提供一个生产prod job,可以手动输入镜像id进行部署.




推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
author-avatar
书友8649571
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有