基于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 ...
随机推荐
- 树莓派系列教程:1.环境与系统,无显示器无键盘无网线联网并使用PuTTy与VNC图形界面远程登录
本文所需物品清单: Raspberry Pi 3 Model B 主板.SD卡与读卡器(用于烧录系统) 资料整理来源在文尾 需要下载的资源与工具: 推荐系统-Raspbian 树莓派官方深度定制的硬件 ...
- Python 上下文管理器和else块
最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...
- ICQ
我一直都想编一个自己的聊天软件,像QQ那种:最近有时间我就自己编了一个.编写的过程中收获很大…… 现在拿出来跟大家分享,有兴趣的朋友可以和我交流交流. 先给大家看一下效果: 启动服务器: 再给大家看一 ...
- 1.1 Python是一种什么样的语言
小时不识月,呼作白玉盘.很多人习惯地说Python不过是一种脚本语言而已,实际上这种说法是非常不准确的,完全不能体现出Python的强大.严格来说,Python是一门跨平台.开源.免费的解释型高级动态 ...
- 2017CCPC 网络选拔赛1003 Ramsey定理
Ramsey定理 任意6个人中,一定有三个人互为朋友,或者互相不是朋友. 证明 这里我就不证明了.下面链接有证明 鸽巢原理 Ramsey定理 AC代码 #include <stdio.h> ...
- 分布式mysql中间件(mycat)
1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...
- linux 分布式文件系统
分布式文件系统(DFS) 指文件系统管理的物理存储资源不一定直接连接在本地节点上 而是通过计算机网络与节点相连 分布式文件系统的设计基于客户机/服务器模式 一个典型的网络可能包括多个多个用户访问的服务 ...
- xp+WinDBG+VMware调试内核
呵呵,搞点突兀的标题而已.其实说的还是如何使用WinDBG和VMware来搭建调试内核的环境而已,这些网上已经有数不清的教程了,不过我喜欢自己亲手写一下.第一,把这个过程写一遍能加深印象,就算以后忘记 ...
- 讨论MMU
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制 ...
- FusionCharts封装-Label
Category.java: /** * @Title:Category.java * @Package:com.fusionchart.model * @Description:FusionChar ...