资讯专栏INFORMATION COLUMN

docker+jenkins+golang持续集成实践[转载自我的博客]

inapt / 1156人阅读

摘要:博客地址起因因为生产需要最近又重新折腾了一下和。主要目的是想自动编译,打包,部署一些的。将宿主机的挂载为容器的目录。这样做的目的是,如果容器被不小心删除也不至于的数据丢失。其中的安装路径在中。

博客地址:yeqown.github.com


起因

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

1. 以前就使用过,上手会更快
2. 社区比较成熟,插件和文档丰富


安装Docker和Pull Jenkins镜像

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


Jenkins & docker-compose配置

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

</>复制代码

  1. version: "2"
  2. services:
  3. jenkins:
  4. container_name: jenkins-lts
  5. ports:
  6. - 9001:8080
  7. - 50000:50000
  8. image: jenkins/jenkins:lts
  9. volumes:
  10. - /home/worker/jenkins/jenkins_home:/var/jenkins_home

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

</>复制代码

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

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

我的目录结构如下:

</>复制代码

  1. ➜ jenkins ll
  2. total 8.0K
  3. -rw-rw-r-- 1 worker worker 220 May 2 17:19 docker-compose.yml
  4. drwxrwxr-x 19 worker worker 4.0K May 3 15:53 jenkins_home
  5. ➜ jenkins pwd
  6. /home/worker/jenkins
  7. ➜ jenkins docker-compose up -d # 运行

Publish Over SSH配置

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

安装Publish Over SSH

容器内ssh-keygen

配置Publish Over SSH

配置Git仓库部署公钥 #这一步相当于拉取代码的Credentials


Golang Build-env

因为默认的Jenkins镜像是不带有Go的编译工具的,所以我们很有必要安装一个Go插件Go-Plugin-Jenkins
具体步骤如下:

安装JenkinsGo插件

在全局工具配置中,安装Go

在对应任务配置-> 构建环境项,选择Go版本

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

</>复制代码

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

如何打包部署

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

</>复制代码

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

这里贴上我的Makefile

</>复制代码

  1. # To test, build, deploy offline-tasks
  2. # -: ignore this commnad error
  3. # @: no display current commnad to std output
  4. # Commnads declare
  5. GOCMD=go
  6. GOTEST=$(GOCMD) test
  7. GOBUILD=$(GOCMD) build
  8. # Params define
  9. MAIN_PATH=../main
  10. PACKAGE_PATH=../package
  11. PACKAGE_BIN_PATH=../package/bin
  12. BIN=offline-tasks
  13. FILENAME=offline-tasks.tar.gz
  14. # Deploy Params
  15. DEV_HOST=zy-dev
  16. DEV_TAR_PATH=/home/worker/project/offline-tasks
  17. PROD_HOST=zy-pro2
  18. PROD_TAR_PATH=/home/worker/project/offline-tasks
  19. default: build pack
  20. test:
  21. # testing
  22. - $(GOTEST) ../... -v
  23. build:
  24. # building
  25. mkdir $(PACKAGE_PATH)
  26. mkdir $(PACKAGE_BIN_PATH)
  27. cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN)
  28. mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH)
  29. cp -r "../configs" $(PACKAGE_PATH)
  30. cp "../sh/start.sh" $(PACKAGE_BIN_PATH)
  31. pack:
  32. # packing
  33. cd $(PACKAGE_PATH) && tar -zcvf ../$(FILENAME) ./*
  34. mv ../$(FILENAME) $(PACKAGE_PATH)
  35. ##################################################
  36. # #
  37. # deploy: from zy-dev to execute #
  38. # deploy-dev: from dev-CI to execute #
  39. # deploy-prod: from prod-CI to execute #
  40. # #
  41. ##################################################
  42. deploy: clean build pack
  43. # deploy dev from dev
  44. cp $(PACKAGE_PATH)/$(FILENAME) $(DEV_TAR_PATH)
  45. cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasks
  46. deploy-dev: clean build pack
  47. # deploy-dev from CI
  48. scp $(PACKAGE_PATH)/$(FILENAME) $(DEV_HOST):$(DEV_TAR_PATH)
  49. ssh $(DEV_HOST) "cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasks"
  50. deploy-prod: clean build pack
  51. # deploying prod from dev or CI
  52. scp $(PACKAGE_PATH)/$(FILENAME) $(PROD_HOST):$(PROD_TAR_PATH)
  53. ssh $(PROD_HOST) "cd $(PROD_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/prod.supervisord.conf restart offline-tasks"
  54. clean:
  55. # cleaning
  56. rm -fr $(PACKAGE_PATH)
  57. rm -fr ../$(FILENAME)

总结

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

</>复制代码

  1. # default set $CURDIR="$PROJ_ROOT/sh"
  2. # preparing works...
  3. GVT_RESTORE=gvt restore
  4. PROJ_ROOT=../
  5. deps:
  6. cd ($PROJ_ROOT) && $(GVT_RESTORE)
  7. build: deps
  8. # building
  9. mkdir $(PACKAGE_PATH)
  10. mkdir $(PACKAGE_BIN_PATH)
  11. cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN)
  12. mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH)
  13. cp -r "../configs" $(PACKAGE_PATH)
  14. cp "../sh/start.sh" $(PACKAGE_BIN_PATH)
  15. # other commands...

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


参考资料

https://zpjiang.me/2017/08/09/Setup-Jenkins-for-Go-Projects/

https://wiki.jenkins.io/display/JENKINS/Go+Plugin

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27290.html

相关文章

  • PHP新手开发者路线建议

    摘要:年开发者应该熟练使用,并且知道版本更新内容。对开发和运维人员来说,最希望的就是一次性创建或配置,可以在任意地方正常运行。是标准规范,是开发的实践标准。对开发者来说语言推荐和,全栈的选择非常多,推荐热门的 前言 在前天(2018-08-02)已经发布了PHP 7.3.0.beta1 Released 如果你还没有使用 PHP7 ,那真的很遗憾。2018年PHP开发者应该熟练使用 PHP7...

    klinson 评论0 收藏0
  • Spring Cloud【使用jenkins持续部署】Gogs+jenkins+Docker Swa

    摘要:而所谓的持续,就是说每完成一个完整的部分,就向下个环节交付,发现问题可以马上调整。那么每完成一部分就测试,这是持续部署。这是一个免费的源代码,可以处理任何类型的构建或持续集成。容器是完全使用沙箱机制,相互之间不会有任何接口。 导读: 很久没有更新文章了 最近公司在使用Spring Cloud构建的项目中经常会持续发布变更频繁,一天中会出现发布多次的情况 在这种情况下对测试环境做了改造 ...

    王笑朝 评论0 收藏0
  • 智能运维 | 如何做好持续集成——Jenkins on Mesos 实践

    摘要:而持续集成的意义就在于减少风险,和重复的过程,最终提高工作效率。第二级调度由被称作的组件组成。能和不同类型的通信,每种由相应的应用集群管理。这是的任务启动过程。数人云运维平台持续集成实践这是数人云运维平台的持续集成实践。 今天小数给大家带来的又是十足的干货:当运维遇到云计算,当Docker遇到Mesos和Jenkins,会擦出怎样的火花呢?且看来自数人云运维工程师金烨的演讲实录分享——...

    lsxiao 评论0 收藏0
  • 基于 jenkinsdocker 个推持续集成平台

    摘要:基于的特性,以及持续集成的需求,个推采用为持续集成搭建了一整套测试系统。个推持续集成流程以一个假设名为模块为例,以开发人员的视角阐述了持续集成的逻辑。 软件开发过程中,开发成员经常需要把自己工作集成到项目中,通常每个成员每天至少集成一次。如果项目较小,对外部的依赖较小,那么软件集成可能不会是什么问题。但是目前很多软件项目特别是互联网项目面临着需求不明确,系统架构复杂,任务分配混乱等一系...

    binaryTree 评论0 收藏0
  • CI Weekly #19 | 关于软件开发模型思考,以及最新 CI/CD 实践分享

    摘要:以上是的所有技术分享,如有问题,请联系我们围绕软件工程效率提升进行一系列技术内容分享,包括国内外持续集成持续交付,持续部署自动化测试等实践教程工具与资源,以及一些工程师文化相关的程序员。 五月一来,夏天便悄然而至。flow.ci 也带来了几个新的变化,帮你进一步优化开发工作流。一起来看看这几个重点功能: 支持 iOS 项目 Xcode8.3 构建 iOSer 们重点来了,flow....

    CoderBear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<