之前我们研究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 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, 由于没有区别就不在这里介绍了
}

  

基于jenkins的go语言项目自动化发布遇到的坑的更多相关文章

  1. jenkins+windows+springboot+.net项目自动化部署图文教程

    之前一直在linux中使用jenkins部署程序,正好现在的项目包括了winfrom程序,所以需要部署到windows系统中 jenkins官网:https://jenkins.io/ 下载之后运行j ...

  2. 基于 flow.ci 实现 PHP 项目自动化持续集成

    高效程序员的习惯之一--让开发流程自动化.Automating shapes smarter future. 这是一个关于如何快速实现 PHP 项目自动化持续集成的快速指导.无论你是否使用过持续集成, ...

  3. 记基于docker+gunicorn部署sanic项目遇到的很多很多坑

    前言: 最近有个项目需要上线,是python中sanic网络异步框架写的,并且要求使用docker+nginx来部署项目实现负载均衡,于是乎百度了sanic项目部署,基本上都是基于docker+gun ...

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

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

  5. 使用jenkins 实现 .net core项目自动发布到 docker

    在Docker内运行Jenkins pull镜像  docker pull jenkins/jenkins:lts Dockerfile FROM jenkins/jenkins:lts USER r ...

  6. jenkins构建maven聚合项目,发布jar包,可配置单独发布某个模块

    https://blog.csdn.net/qq_42703181/article/details/109643330

  7. 基于Jenkins的持续交付方案

    简介 Jenkins是开源的自动化编译.测试.部署的Web应用程序一个持续性交付应用 Jenkins的优势 1.Jenkins在国内的开发者中认可度较高,很多创业公司的自建持续交付系统的选择大部分都是 ...

  8. Jenkins CI&CD 自动化发布项目实战(下篇)

    Jenkins CI&CD 自动化发布项目实战(下篇) 作者 刘畅 时间 2020-12-04 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

  9. Jenkins CI&CD 自动化发布项目实战(上篇)

    Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

随机推荐

  1. 使用nodejs搭建api的mock服务

    1. 介绍 公司的业务开发都是静态页面,开发前期总是避免不了获取api的问题.在vue中有一些mockjs的方案,方案都是注入性质的,和最终部署总是有差别,而且业务大部分还在zepto下,很难找到合适 ...

  2. xBIM WeXplorer 设置模型颜色

    目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...

  3. Java遍历文件目录

    函数介绍 File[] listFiles():返回当前文件的子目录或子文件的文件数组. 遍历目录 调用listFiles()即可得文件的子目录和子文件,如果存在子目录,那么子目录需要再次调用list ...

  4. uva 116 单向TSP

    这题的状态很明显. 转移方程就是 d(i,j)=min(d(i+1,j+1),d(i,j+1),d(i-1,j+1)) //注意边界 我用了一个next数组方便打印结果,但是一直编译错误,原来是不能用 ...

  5. 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.

    spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...

  6. nginx新的站点的配置

    每一次配置新的站点的时候,要记得重新启动nginx: sudo -s; nginx -s reload; 配置文件,有涉及到 每一个站点都有一个.conf文件. 域名重定向:Gas Mask的软件的使 ...

  7. ActiveMq笔记1-消息可靠性理论

    原博客:http://shift-alt-ctrl.iteye.com/blog/2020182 https://mp.weixin.qq.com/s/h74d6LtGB5M8VF0oLrXdCA 我 ...

  8. Hbase多列范围查找(效率)

    Hbase索引表的结构 Hbase Rowkey 设计 Hbase Filter Hbase二级索引 Hbase索引表的结构 在HBase中,表格的Rowkey按照字典排序,Region按照RowKe ...

  9. MyBatis入门一

    本人只是刚刚学习MyBatis,作为学习路程的记录,写的不好,不完善的地方请多多包涵: 首先,先比较一下Hibernate和MyBatis两种框架之间的区别: 两种都是ORM框架,但是Hibernat ...

  10. Android常见漏洞

    Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏 ...