基于jenkins的go语言项目自动化发布遇到的坑
之前我们研究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语言项目自动化发布遇到的坑的更多相关文章
- jenkins+windows+springboot+.net项目自动化部署图文教程
之前一直在linux中使用jenkins部署程序,正好现在的项目包括了winfrom程序,所以需要部署到windows系统中 jenkins官网:https://jenkins.io/ 下载之后运行j ...
- 基于 flow.ci 实现 PHP 项目自动化持续集成
高效程序员的习惯之一--让开发流程自动化.Automating shapes smarter future. 这是一个关于如何快速实现 PHP 项目自动化持续集成的快速指导.无论你是否使用过持续集成, ...
- 记基于docker+gunicorn部署sanic项目遇到的很多很多坑
前言: 最近有个项目需要上线,是python中sanic网络异步框架写的,并且要求使用docker+nginx来部署项目实现负载均衡,于是乎百度了sanic项目部署,基本上都是基于docker+gun ...
- 基于Jenkins + Git的PHP项目编译脚本
本文针对的是了解或已经在使用Jenkins和Git的开发者或团队. 本团队使用了Jenkins作为持续集成平台,Git作为版本管理工具,而本人负责的项目是PHP项目,所谓发布项目就是复制文件. 通常有 ...
- 使用jenkins 实现 .net core项目自动发布到 docker
在Docker内运行Jenkins pull镜像 docker pull jenkins/jenkins:lts Dockerfile FROM jenkins/jenkins:lts USER r ...
- jenkins构建maven聚合项目,发布jar包,可配置单独发布某个模块
https://blog.csdn.net/qq_42703181/article/details/109643330
- 基于Jenkins的持续交付方案
简介 Jenkins是开源的自动化编译.测试.部署的Web应用程序一个持续性交付应用 Jenkins的优势 1.Jenkins在国内的开发者中认可度较高,很多创业公司的自建持续交付系统的选择大部分都是 ...
- Jenkins CI&CD 自动化发布项目实战(下篇)
Jenkins CI&CD 自动化发布项目实战(下篇) 作者 刘畅 时间 2020-12-04 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...
- Jenkins CI&CD 自动化发布项目实战(上篇)
Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...
随机推荐
- 在Vue2.0中集成UEditor 富文本编辑器
在vue的'项目中遇到了需要使用富文本编辑器的需求,在github上看了很多vue封装的editor插件,很多对图片上传和视频上传的支持并不是很好,最终还是决定使用UEditor. 这类的文章网上有很 ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记20
day20课程内容: 模块: #模块一共三种:1.Python标准库 2.第三方模块 3.应用程序自定义的模块#import sysimport jisuanapp#print(jisuanapp.a ...
- python——Django项目模板
views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts impor ...
- ZOJ - 3818 字符串
思路:对于"ABABA"可以先枚举"AB",然后检查下一个串是否等于"AB",剩下的串就是A,最后检查A和B是否相等:对于"ABA ...
- HDU - 1847 巴什博弈
思路: 0 1 2 3 4 5 6 7 8 9 10 11 12 P N N P N N P N N P N N P 不难发现:当n为三的倍数时,KIKI ...
- SpringMvc Json LocalDateTime 互转,form urlencoded @ModelAttribute 转换
JDK8 的LocalDate 系列日期API ,比Date 或者 Calendar 都好用很多,但是在SpringMvc 自动装配会有点小问题 会导致抛出类似异常 default message [ ...
- Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的. 可以通过 iptables-save 命令打印出当前节点的 iptable ...
- MySQL双主一致性架构优化
一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点. 在一个MySQL数据库集群中可以设置两个主库,并设置双向 ...
- 【java学习笔记】Properties
Properties:可以持久化的映射,规定键和值的类型是String. Properties对象必须放到.properties文件中,其中properties文件默认为西欧编码,也因此不存储中文. ...
- R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 终于开始攻克并行这一块了,有点小兴 ...