基于GitLab CI搭建Golang自动构建环境

Golang发布遇到的问题

对于golang的发布,之前一直没有一套规范的发布流程,来看看之前发布流程:

方案一

  • 开发者本地环境需要将环境变量文件改为正式环境配置

  • 编译成可执行文件

  • 发送给运维

  • (运维)将文件覆盖为线上

  • (运维)重启进程

(可谓“又臭又长”)

方案二

  • 开发者讲代码commit到gitlab上交给运维同学

  • (运维)pull代码

  • (运维)编译成可执行文件

  • (运维)覆盖线上文件

  • (运维)重启进程

这种对于运维属于重度依赖,而运维同学又需要去关心代码的编译,增加了运维同学的工作了。

以上两种方案都是之前项目中发生过的,对于发版来说可谓是一种“噩梦”,易出错,流程长,运维要是不在根本无法操作。

解决方案

为了解决上面提到的两种发布问题,目前我们做了如下的设计方案:

  1. 开发者提交代码到GitLab服务器

  2. 添加一个Tag触发构建(.gitlab-ci.yml+makefile)

  3. 将构建后的文件打包添加上版本号(1.0.0+)后推送到版本服务器

  4. 在Jenkins选择对应的版本号发布到指定Web Server上

发布时,开发只需要编写“.gitlab-ci.yml”以及makefile对项目进行构建,而运维只需要配置jenkins,将文件发布到Web Server上即可,完成了开发和运维的解耦。

什么是GitLab-CI

GitLab CIGitLab Continuous Integration (Gitlab 持续集成)的简称。从 GitLab 的 8.0 版本开始,GitLab 就全面集成了 Gitlab-CI,并且对所有项目默认开启。只要在项目仓库的根目录添加 .gitlab-ci.yml 文件,并且配置了 Runner(运行器),那么每此添加新的tag都会触发 CI pipeline

一些概念

在介绍 GitLab CI 之前,我们先看看一些持续集成相关的概念。

Pipeline

一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。 任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示:

+------------------+           +----------------+
| | trigger | |
| Commit / MR +---------->+ Pipeline |
| | | |
+------------------+ +----------------+

Stages

Stages 表示构建阶段,说白了就是上面提到的流程。 我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:

  • 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始

  • 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功

  • 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败

因此,Stages 和 Pipeline 的关系就是:

+--------------------------------------------------------+
| |
| Pipeline |
| |
| +-----------+ +------------+ +------------+ |
| | Stage |---->| Stage |----->| Stage | |
| +-----------+ +------------+ +------------+ |
| |
+--------------------------------------------------------+

Jobs

Jobs 表示构建工作,表示某个 Stage 里面执行的工作。 我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:

  • 相同 Stage 中的 Jobs 会并行执行

  • 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功

  • 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

所以,Jobs 和 Stage 的关系图就是:

+------------------------------------------+
| |
| Stage |
| |
| +---------+ +---------+ +---------+ |
| | Job | | Job | | Job | |
| +---------+ +---------+ +---------+ |
| |
+------------------------------------------+

什么是MakeFile

Makefile文件的作用是告诉make工具需要如何去编译和链接程序,在需要编译工程时只需要一个make命令即可,避免了每次编译都要重新输入完整命令的麻烦,大大提高了效率,也减少了出错率。

基本介绍

我们平常很多时候都是直接在命令行输入go build进行编译的:

go build .

或者测试使用go run运行项目:

go run main.go

我看有很多大型开源项目都是如下方式 :

make build
# 或者
make install

我们打包运行这个过程,还有一个更加贴切的词语叫做构建项目。

案例

我们先创建一个新的工程,目录如下:

  • main.go

  • Makefile

make.go源码:

package main

import "fmt"

func main() {
fmt.Println("hi, pang pang.")
}

就多了一个Makefile文件,如果要使用Makefile去构建你项目,就需要在你的项目里面新建这个Makefile文件。

这里我贴一个简单的Makefile文件的源码:

BINARY_NAME=hello
build:
go build -o $(BINARY_NAME) -v
./$(BINARY_NAME)

解释下上面各行的意思:

  • 第一行,声明了一个变量BINARY_NAME他的值是hello,方便后面使用

  • 第二行,声明一个 target,其实你可以理解成一个对外的方法

  • 第三行,这就是这个target被调用时执行的脚本,这行就是build这个项目,编译后的二进制文件放在当前工程目录下,名字是变量BINARY_NAME的值

  • 第四行,这一行就是直接执行当前目录下的二进制文件

构建

我们打开我们的终端,直接执行:

make build

将生成一个可执行文件hello,这就是对Makefile的简单介绍,具体命令推荐 阮一锋的Makefile教程

部署流程

前面大致介绍了构建自动化构建的用到的一些概念和工具,那么我们就可以开始我们的部署了。

GitLab Runner

了解上面了基本的概念后,那由何人来执行这些任务呢?那就是 GitLab Runner(运行器)

安装

安装 GitLab Runner 太简单了,按照着 官方文档 的教程来就好拉! 下面是 Debian/Ubuntu/CentOS 的安装方法,其他系统去参考官方文档:

# For Debian/Ubuntu
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ci-multi-runner

# For CentOS
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
$ sudo yum install gitlab-ci-multi-runner

注册 Runner

安装好 GitLab Runner 之后,我们只要启动 Runner 然后和 CI 绑定就可以了:

  • 打开你 GitLab 中的项目页面,在项目设置中找到 runners

  • 运行 sudo gitlab-ci-multi-runner register

  • 输入 CI URL

  • 输入 Token

  • 输入 Runner 的名字

  • 选择 Runner 的类型,简单起见还是选 Shell 吧

  • 完成

当注册好 Runner 之后,可以用 sudo gitlab-ci-multi-runner list 命令来查看各个 Runner 的状态:

$ sudo gitlab-runner list
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
my-runner Executor=shell Token=cd1cd7cf243afb47094677855aacd3 URL=http://mygitlab.com/ci

.gitlab-ci.yml编写

before_script:
- export GOPATH=$GOPATH:/usr/local/${CI_PROJECT_NAME}
- export # 引入环境变量
- cd /usr/local/${CI_PROJECT_NAME}/src/${CI_PROJECT_NAME}
- export VERSION=`echo ${CI_COMMIT_TAG} | awk -F"_" '{print $1}'`

# stages
stages:
- build
- deploy
# jobs
build-tags:
stage: build
script:
## 执行makefile文件
- make ENV="prod" VERSION=${VERSION}
- if [ ! -d "/data/code/project_name/tags/${VERSION}" ]; then
mkdir -p "/data/code/project_name/tags/${VERSION}/";
fi
- cd compiler/
- mv -f project_name.tar.gz /data/code/project_name/tags/${VERSION}/
only:
- tags
deploy-tags:
stage: deploy
script:
- cd /data/code/project_name/tags/
- svn add ${VERSION}
- svn commit -m "add ${CI_COMMIT_TAG}"
only:
- tags

Makefile编写

export VERSION=1.0.
export ENV=prod
export PROJECT=project_name

TOPDIR=$(shell pwd)
OBJ_DIR=$(OUTPUT)/$(PROJECT)
SOURCE_BINARY_DIR=$(TOPDIR)/bin
SOURCE_BINARY_FILE=$(SOURCE_BINARY_DIR)/$(PROJECT)
SOURCE_MAIN_FILE=main.go

BUILD_TIME=`date +%Y%m%d%H%M%S`
BUILD_FLAG=-ldflags "-X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)"

OBJTAR=$(OBJ_DIR).tar.gz

all: build pack
@echo "\n\rALL DONE"
@echo "Program: " $(PROJECT)
@echo "Version: " $(VERSION)
@echo "Env: " $(ENV)

build:
@echo "start go build...."
@rm -rf $(SOURCE_BINARY_DIR)/*
@go build $(BUILD_FLAG) -o $(SOURCE_BINARY_FILE) $(SOURCE_MAIN_FILE)

pack:
@echo "\n\rpacking...."
@tar czvf $(OBJTAR) -C $(OBJ_DIR) .

执行

完成的部署流程(其实很简单),然后每次要构建只需要执行:

git commit -a -m "我准备打tag测试啦"
git push

## 打tag
git tag -a "1.0.0" -m"1.0.0"
git push origin 1.0.

那么在GitLab就会看到:

大功告成,以上!~

总结

其实发布流程有无数种,每一个团队都有合适自己的发布流程,如果项目小,团队小,也许手动发布就足够了,而对于项目有一定规模的团队,或许需要更加规范的发布流程来保障项目的稳定发版。

但是对于项目的发版,每个人都应该要有根据团队目前现状去选择和制定最合适的方案的能力,除此之外,上面提到的工具和语言也是不错的工具噢!~

原文地址

https://github.com/WilburXu/blog/blob/master/other/%E5%9F%BA%E4%BA%8EGitLab%20CI%E6%90%AD%E5%BB%BAGolang%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E7%8E%AF%E5%A2%83.md

基于GitLab CI搭建Golang自动构建环境的更多相关文章

  1. [转] 基于Gitlab CI搭建持续集成环境

    [From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三 ...

  2. c#搭建jenkins自动构建环境

    这边我使用的是参数化构建过程,文笔比较差劲,就直接上干货了 1.定义构造参数 2.设置jenkins工作空间目录,在此定义了版本号和工作目录构建参数 3.配置svn 4.构建触发器,用于轮询查看svn ...

  3. 基于S7-PLCSIM Advanced搭建S7通信仿真环境

    写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...

  4. k8s Gitlab CI/CD 之自动编译Docker镜像并推送到指定的Registry

    环境介绍: 说明 节点 ip 系统 Gitlab Server git.ds.com 10.0.1.179 CentOS 7.5.1804 Gitlab Runner   10.0.1.178 Cen ...

  5. gitlab+jenkins+hook代码自动构建发布上线

    Gitlab+Jenkins+Hook 1.gitlab和jenkins的安装见: http://www.cnblogs.com/cuishuai/p/7544663.html http://www. ...

  6. 基于Visual Studio Code搭建Golang开发调试环境【非转载】

    由于对Docker+kubernetes的使用及持续关注,要理解这个平台的原理,势必需要对golang有一定的理解,基于此开始利用业余时间学习go,基础语法看完之后,搭建开发环境肯定是第一步,虽然能g ...

  7. 基于ubuntu 14搭建nginx+php+mysql环境

    基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境, 以下全部命令行操作: 1 由于需要大量的权限操作,方便起见临时提升权限,使用root账号 sudo su ...

  8. 快速搭建appium自动测试环境

    首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到"Do ...

  9. jenkins结合gitlab实现提交代码自动构建

    jenkins可以说是现在非常流行的一个继续集成工具,几乎所有的公司都在用,并且它也基本是devops的连接者,是一个比较核心的工具. 主要记录以下两个: 利用jenkins和gitlab的webho ...

随机推荐

  1. 【ARTS】01_40_左耳听风-201900812~201900818

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  2. 查看Mysql是否开启binlog

    show variables like 'log_bin';

  3. mysql You can't specify target table for update in FROM clause解决方法

    mysql You can't specify target table for update in FROM clause解决方法出现这个错误的原因是不能在同一个sql语句中,先select同一个表 ...

  4. string中的erase()函数

    erase()是对string类型的字符串进行删除元素操作的函数 1.erase(int index) 删除下标从index开始直到字符串结尾的元素 1 string s = "123215 ...

  5. GSVA的使用

    GSVA的简介 Gene Set Variation Analysis,被称为基因集变异分析,是一种非参数的无监督分析方法,主要用来评估芯片核转录组的基因集富集结果.主要是通过将基因在不同样品间的表达 ...

  6. R画柱形图和箱线图

    数据格式如下 gene_id Sham-1 Sham-2 Sham-3 Sham-4 Sham-5 Rep-1h-1 Rep-1h-2 Rep-1h-3 Rep-1h-4 Rep-1h-5 Rep-3 ...

  7. QT qml TreeView展示数据结构于界面

    Class  QAbstractItemModel: 使用QML的TreeView类来展示树状的结构,对应的是QT的Model/View模型.这个model是一个数据模型,要为TreeView提供一个 ...

  8. CentOS 7.6出现SSH登录失败的解决方法

    CentOS 7.6出现SSH登录失败的解决方案 问题重现: iterm登录 ssh vagrant@192.168.10.10 The authenticity of host '192.168.1 ...

  9. Keras中图像维度介绍

    报错问题: ValueError: Negative dimension size caused by subtracting 5 from 1 for 'conv2d_1/convolution' ...

  10. shell 学习笔记7-shell-函数

    一.函数 1.什么是shell函数 把相同程序段定义成函数,可以减少整个程序的代码量,提升开发效率 增加程序的可读性,易读性,提升管理效率 可以失效程序功能模块化,使程序具备可移植性 其实linux系 ...