博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker+jenkins+golang持续集成实践[转载自我的博客]
阅读量:6674 次
发布时间:2019-06-25

本文共 4154 字,大约阅读时间需要 13 分钟。

博客地址:


起因

因为生产需要最近又重新折腾了一下Jenkins和docker。主要目的是想自动编译,打包,部署一些Golang的HttpServer。于是决定使用Jenkins来做这个持续集成的载体,选择Jenkins出于两点原因:

1. 以前就使用过,上手会更快

2. 社区比较成熟,插件和文档丰富


安装Docker和Pull Jenkins镜像

这一步,作为前置条件且不是本文主要要描述的步骤,因此略去。网上也有很多参考资料~


Jenkins & docker-compose配置

为了方便我才用了docker-compose这个工具,docker-compose 基础可以参见我的。这里直接上配置:

version: '2'services:  jenkins:    container_name: jenkins-lts    ports:      - 9001:8080      - 50000:50000    image: jenkins/jenkins:lts    volumes:      - /home/worker/jenkins/jenkins_home:/var/jenkins_home

配置也是官方的示例配置。

Note: 将宿主机的/home/worker/jenkins/jenkins_home挂载为容器的/var/jenkins_home目录。这样做的目的是,如果容器被不小心删除也不至于Jenkins的数据丢失。

到这里,我们只需要执行docker-compose up -d便可以将Jenkins容器跑起来了,再配置一下Nginx,便可以直接访问到Jenkins页面了,并进行初始化。

我的目录结构如下:

➜  jenkins lltotal 8.0K-rw-rw-r--  1 worker worker  220 May  2 17:19 docker-compose.ymldrwxrwxr-x 19 worker worker 4.0K May  3 15:53 jenkins_home➜  jenkins pwd/home/worker/jenkins➜  jenkins docker-compose up -d # 运行

Publish Over SSH配置

Publish Over SSH配置,由于我们是通过docker运行的Jenkins,因此要特别配置一下SSH,方便Jenkins部署项目。这里先列出步骤:

  1. 安装Publish Over SSH
  2. 容器内ssh-keygen
  3. 配置Publish Over SSH
  4. 配置Git仓库部署公钥 #这一步相当于拉取代码的Credentials

Golang Build-env

因为默认的Jenkins镜像是不带有Go的编译工具的,所以我们很有必要安装一个Go插件

具体步骤如下:

  1. 安装JenkinsGo插件
  2. 在全局工具配置中,安装Go
  3. 在对应任务配置-> 构建环境项,选择Go版本

这一步的详细步骤可以在参考文献第一条中查询Setup Go Build Environment

Note: 官方文档中说全局配置Go是在系统设置中进行的,但是我用的
Jenkins ver. 2.107.2,这一项配置是在全局工具配置中。

如何打包部署

编写一个makefile来打包项目,通过scp来分发部署服务,这也是配置Publish Over SSH的目的。

由于Jenkins镜像不带有make相关工具(甚至Vim也没有),所以需要安装Make及其相关工具。与此同时,如果项目使用了相关的依赖管理工具,因此还有必要去配置相关的GO环境变量。其中Go的安装路径在:
/var/jenkins_home/tools/org.jenkinsci.plugins.golang.GolangInstallation/$GOVERSION中。

这里贴上我的Makefile

# To test, build, deploy offline-tasks#   -: ignore this commnad error#   @: no display current commnad to std output# Commnads declareGOCMD=goGOTEST=$(GOCMD) testGOBUILD=$(GOCMD) build# Params defineMAIN_PATH=../mainPACKAGE_PATH=../packagePACKAGE_BIN_PATH=../package/binBIN=offline-tasksFILENAME=offline-tasks.tar.gz# Deploy ParamsDEV_HOST=zy-devDEV_TAR_PATH=/home/worker/project/offline-tasksPROD_HOST=zy-pro2PROD_TAR_PATH=/home/worker/project/offline-tasksdefault: build packtest:   # testing  - $(GOTEST) ../... -vbuild:   # building  mkdir $(PACKAGE_PATH)  mkdir $(PACKAGE_BIN_PATH)  cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN)   mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH)  cp -r "../configs" $(PACKAGE_PATH)  cp "../sh/start.sh" $(PACKAGE_BIN_PATH)pack:  # packing  cd $(PACKAGE_PATH) && tar -zcvf ../$(FILENAME) ./*  mv ../$(FILENAME) $(PACKAGE_PATH)###################################################                                                ##   deploy:         from zy-dev to execute       ##   deploy-dev:     from dev-CI to execute       ##   deploy-prod:    from prod-CI to execute      ##                                                ###################################################deploy: clean build pack  # deploy dev from dev  cp $(PACKAGE_PATH)/$(FILENAME) $(DEV_TAR_PATH)  cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasksdeploy-dev: clean build pack  # deploy-dev from CI  scp $(PACKAGE_PATH)/$(FILENAME) $(DEV_HOST):$(DEV_TAR_PATH)  ssh $(DEV_HOST) "cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasks"deploy-prod: clean build pack  # deploying prod from dev or CI  scp $(PACKAGE_PATH)/$(FILENAME) $(PROD_HOST):$(PROD_TAR_PATH)  ssh $(PROD_HOST) "cd $(PROD_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/prod.supervisord.conf restart offline-tasks"clean:  # cleaning  rm -fr $(PACKAGE_PATH)  rm -fr ../$(FILENAME)

总结

进过上述的一系列操作之后,只剩下一个比较尴尬的问题了:如果Go代码仓库中vendor不带有依赖项目,那么获取依赖的动作就要自己手动来操作了~。或许可以在makefile中新增一个deps,如下:

# default set $CURDIR="$PROJ_ROOT/sh"# preparing works...GVT_RESTORE=gvt restorePROJ_ROOT=../deps:  cd ($PROJ_ROOT) && $(GVT_RESTORE)build: deps  # building  mkdir $(PACKAGE_PATH)  mkdir $(PACKAGE_BIN_PATH)  cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN)   mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH)  cp -r "../configs" $(PACKAGE_PATH)  cp "../sh/start.sh" $(PACKAGE_BIN_PATH)# other commands...

并且加deps命令,加build命令中,每次打包都检查一下依赖。


参考资料

转载地址:http://dqgxo.baihongyu.com/

你可能感兴趣的文章
6421B Lab2 DHCP的配置及故障排除
查看>>
[C# 基础知识梳理系列]专题一:深入解析委托——C#中为什么要引入委托
查看>>
FOSCommentBundle功能包:其它添加评论到页面的方法
查看>>
SQL Server 2012笔记分享-17:理解并设置文件表(FileTable)
查看>>
MongoDB运行状态、性能监控与分析
查看>>
Exchange 2016共享邮箱不保存已发送邮件的问题
查看>>
[C#基础知识系列]全面解析C#中静态与非静态
查看>>
SQL Server 2012笔记分享-40:自动维护索引
查看>>
Nginx实战基础篇三 Nginx上虚拟主机的实现过程
查看>>
百度SiteApp开始清理未备案的网站
查看>>
Lync Server 2013 实战系列之五:标准版-定义拓扑生成器
查看>>
统计数据库大小
查看>>
【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
查看>>
Linux 学习_samba
查看>>
不说技术~有时,开发者还是应该讲究一点!
查看>>
如何做好工作流定义
查看>>
.NET I/O 学习笔记:目录和文件
查看>>
pgpool-II3.1 的begin transaction 和 自动追加 BEGIN/COMMIT问题
查看>>
(转)记hadoop故障一例:BlockAlreadyExistsException
查看>>
hdu 4284 Travel floyd + 状压DP
查看>>