设为首页 收藏本站
查看: 1195|回复: 0

[经验分享] 基于jenkins的go语言项目自动化发布遇到的坑

[复制链接]
发表于 2018-9-3 11:46:13 | 显示全部楼层 |阅读模式
  本文转载自:http://www.javaxxz.com/thread-359435-1-1.html
  之前我们研究dep,就是为了有一天可以实现go语言项目在我们系统里的CI. 之前联物科技的项目主要是使用java作为后端开发语言,基于jenkins的自动发布,使用了pipeline编写脚本,从拉取代码,使用maven编译,构建docker镜像,推送镜像到仓库,调用接口执行docker swarm命令进行容器部署。我一直觉得go目前这个阶段不适合实现传统以业务逻辑为主的系统,但现在有一个项目比较特殊,于是使用了go作为实现。为了也能实现自动化,我和运维从写dockerfile, stackfile,到能自动发布,足足折腾了小一天.
  考虑到这方面的资料比较少,下面就把遇到的坑讲解一遍, 不熟悉dep的可以先看这篇文章
   
  部分依赖无法下载
  由于我们代码的依赖项目中又依赖了golang.org/x 下的部分功能,而golang.org下的代码,能不能下载完全看命,即使我们的jenkins服务器在阿里云上,做一些FQ下载已经比公司内或者家里快很多了,对golang.org这个域名下的东西依旧是无能为力(完全ping不通). 好在golang.org/x 也算标准库,兼容性好,我机器上有一些很早之前的版本也能用. 这时候先要在项目的Gopkg.toml文件中,页头增加这一段标识
   

  •   ignored = ["golang.org/*"]
  复制代码
   
  这是在之前文章里没提过的,意味着不需要dep解析所有golang.org路径下代码的依赖.dep就不会为其在Gopkg.lock中的内容,也不会去下载到vendor文件夹中,需要你或者手工添加到vendor文件夹中,或者在GOPATH下存在相应代码,否则dep ensure可以通过,但go build或go install会失败. 我采取了后者,人工拷贝到jenkins服务器的GOPATH下. 理由是考虑其比较通用. 对于一些特定领域使用的包,不大的话,可以添加到vendor文件夹里并且推到版本控制服务器. 但无论选哪个,都要做上面代码的配置
  待构建代码必须在GOPATH下
  严格说来这并不算一个坑,谁都知道如果要dep或者build,代码就要在GOPATH下,但配置的时候还是忘了.
  对于一个java项目,我们会将其下载到 /workspace/ 下,并以其作为工作目录,执行maven操作,最后拿到target目录下的jar包继续进行下一步操作. 但dep不但要求jenkins下载下来的代码在GOPATH/src下,还要求其存放路径和其在代码仓库中的完全一致:因为你项目内部一定也互相引用了,如果你把github.com/A/B的项目放到了GOPATH/src/github.com/C 下,dep会解析失败,报出很奇怪的错误. 这点要尤其注意,坑了我好久
  所以我们把代码放在了/workspace//src/  目录下,并且把/workspace/ 临时export成了另外一个GOPATH. 开始我们考虑直接将其下载到服务器的GOPATH下,但很快否定了:1. 有可能有多版本的同时发布,而我们的旧代码策略是要存1天 2. 多个不同go项目同时发布也会造成影响,可能会让一些错误的项目成功build通过
  git也要临时加到PATH中
  不知道为什么,在服务器上可以dep通过的项目,但在jenkins的自动执行下,执行dep却报"git is not installed"的异常,我们的git放到了/usr/local/bin目录下,之前java项目命名运行很好,这个问题至今没研究出结果,可能和jenkins使用了自己的用户有关. 解决方案是在pipelien的脚本中把git地址再加入到PATH中
  之后在pipeline的脚本中增加 dep ensure就可以,阿里云上下载还是比我们公司快很多的(经常是5分钟起),dep一次的时间完全在可接受范围内.
  完成了这一步,在根目录执行go build生成二进制文件,并且ADD到docker image中,进行很顺利,但在docker run 时候执行这个二进制文件时候,问题又来了
   
  注意构建环境 
  docker container中执行这个二进制文件报"not found",我们猜测是因为go build是在jenkins服务器上执行的,jenkins服务器是centos的,而基础镜像则选择了alpine,alpine缺少一些在centos下go build没有打进去c库. 最后还是选了一个其他大一点的基础镜像
   
  以上就是我们这一天的坎坷经历,以下是处理过的pipeline脚本,供大家参考
   

  •   node{
  •   def VERSION
  •   def REGISTRY = "{我们的镜像仓库地址}"
  •   def ENV = "iot-dev"
  •   stage("Preparation") {
  •   sh "mkdir -p src/{我们的gitlab仓库地址}/arch/gmqtt"
  •   dir("src/{我们的gitlab仓库地址}/arch/gmqtt") {
  •   git branch: "dev_0.x", credentialsId: "080cf534-36fd-43ad-9ace-f499fe22ebbd", url: "http://{我们的gitlab仓库地址}/arch/gmqtt.git"
  •   }
  •   }
  •   stage("Build") {
  •   dir("src/{我们的gitlab仓库地址}/arch/gmqtt") {
  •   VERSION = readFile "version.txt"
  •   sh "export GOPATH=${WORKSPACE}:/usr/local/gopath && export PATH=$PATH:/usr/local/bin:/usr/local/bin/go/bin && /usr/local/gopath/bin/dep ensure && go build"
  •   }
  •   }

  •   ... 后面是build docker image, push docker image以及deploy, 由于没有区别就不在这里介绍了
  •   }
  复制代码
   
   
   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-562013-1-1.html 上篇帖子: Linux下安装配置Jenkins 下篇帖子: jenkins 部署java 项目
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表