之前我们研究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项目,我们会将其下载到 <jenkins path>/workspace/<job> 下,并以其作为工作目录,执行maven操作,最后拿到target目录下的jar包继续进行下一步操作. 但dep不但要求jenkins下载下来的代码在GOPATH/src下,还要求其存放路径和其在代码仓库中的完全一致:因为你项目内部一定也互相引用了,如果你把github.com/A/B的项目放到了GOPATH/src/github.com/C 下,dep会解析失败,报出很奇怪的错误. 这点要尤其注意,坑了我好久

  所以我们把代码放在了<jenkins path>/workspace/<job>/src/  目录下,并且把<jenkins path>/workspace/<job> 临时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 VERSIONdef 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, 由于没有区别就不在这里介绍了
}

  

转载于:https://www.cnblogs.com/anti-archs/p/8592615.html

基于jenkins的go语言项目自动化发布遇到的坑相关推荐

  1. jenkins+git+maven搭建项目自动化持续集成

    2019独角兽企业重金招聘Python工程师标准>>> 1.概要说明 为了开发人员和测试人员的解耦,让开发和测试流程更加便捷,所以采用jenkins+git+maven这套可持续性集 ...

  2. 基于Jenkins + Git的PHP项目编译脚本

    本文针对的是了解或已经在使用Jenkins和Git的开发者或团队. 本团队使用了Jenkins作为持续集成平台,Git作为版本管理工具,而本人负责的项目是PHP项目,所谓发布项目就是复制文件. 通常有 ...

  3. GitLab + Jenkins实现一键分布式项目自动化部署

    分布式项目的打包部署增加了运维人员的工作量,而且工作是机械重复,极无技术含量的,说白就是打更.我们要把复杂的事情简单化,简单的事情标准化,标准的事情流程化,所以打包部署成了我们流程化里头的流水线. 该 ...

  4. 记一次Android全流程开发体验经历以及Android Studio使用【从环境搭建到项目打包发布 + 真实踩坑总结】

    前言 临时安排接手一个 Android 应用项目开发,庆幸的是 Android APP 已经开发完成,我只需要在我的电脑上运行起来打包看一下效果即可,但是对于一个从未接触过安卓开发的我来说真的是费尽脑 ...

  5. Jenkins+Gitlab+Nginx实现自动发布与回退基于tag版本的静态项目(解决重复构建问题)

    环境拓扑:  Jenkins -192.168.1.30  Gitlab -192.168.1.31  LB -192.168.1.32  Nginx1 -192.168.1.33  Nginx2 - ...

  6. 【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(上)

    目录 一.k8s 助力 DevOps 在企业落地实践 1.1 传统方式部署项目为什么发布慢,效率低? 1.2 上线一个功能,有多少时间被浪费了? 1.3 如何解决发布慢,效率低的问题呢? 1.4 什么 ...

  7. Jenkins+Gitlab+Nginx+SonarQube+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    环境拓扑:  Jenkins -192.168.1.30  Gitlab -192.168.1.31  LB -192.168.1.32  Web1 -192.168.1.33  Web2 -192. ...

  8. Jenkins自动化构建vue项目然后发布到远程服务器

    一.请确保当前服务器安装了docker和jenkins,没安装的请看<在centos7系统安装docker及用docker安装jenkins> (jenkins里面的目录路径为/var/j ...

  9. Jenkins自动化构建vue项目然后发布到远程Linux服务器

    部署Jenkins参照另一篇博客: centos7安装Jenkins及其卸载 一.jenkins相关插件的安装 1.安装Publish Over SSH插件用于SSH连接远程的服务器. 登录 jenk ...

最新文章

  1. 拼多多,一面,i++ 是线程安全的吗?一脸蒙逼
  2. 世界上最经典的25句话
  3. 52条SQL语句性能优化策略
  4. cleanmymac能够很方便的清理mac上面没用的软件,尤其是这个清理大文件的功能
  5. SAP Spartacus中使用到的Angular ModuleWithProviders类型
  6. 如何定制化SAP Fiori标准应用里UI字段的标签
  7. vsftpd FTP Server ‘ls.c‘ 远程拒绝服务漏洞(CVE-2011-0762)漏洞修复方案
  8. java程序linux自己更新自己,Linux下升级JAVA的一个小方法
  9. hdu 4284(状压dp)
  10. java高级类型_Java第四章高级类属性一
  11. Python Project Euler 013:100个50位数和
  12. 怎样裁剪照片大小尺寸?如何在线编辑图片?
  13. Grammarly:最优秀的日常英文写作辅助工具——论文英文校验
  14. ELK - docker
  15. element-ui中的表格组件实现隔行换色
  16. 中国卸油系统行业市场供需与战略研究报告
  17. ORACLE 性能优化示例
  18. Empire信息收集
  19. 【面试题】HTML篇(一)
  20. 【香蕉oi】Tree(欧拉序、线段树)

热门文章

  1. 推荐一个前端ui框架:SuperUI ui开发框架
  2. 【ES6(2015)】Iterator
  3. linux 服务器(CentOS7)搭建PHP环境+SSH配置+服务器文件上传配置
  4. tablueau地图标记圆形_高德地图实现自定义小蓝点 自定义点标记 绘制多边形/圆形区域 根据地图的移动显示或者隐藏自定义点标记的相关实现...
  5. Linux笔记-利用chkconfig创建脚本使得Rabbimq开机自启
  6. Web笔记-html中svg的基本使用
  7. Linux学习笔记-命名管道(FIFO)
  8. 谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目
  9. php 重新编译_linux下为php添加GD库(重新编译php)
  10. android 数据回传代码,安卓向.net core api传输图片,执行保存到数据库命令后返回400错误代码,用postman测试没有问题安卓程序不行...