Gitlab CI
需求背景
代码在编写完成时,我们可能应该做过code lint、code fmt、code test等测试尽量保证代码质量问题,尽可能保证代码能通过单元测试等一些操作。这一系列操作我们可以通过持续集成来通过流水线的形式自动跑起来。owner人员从review代码到提PR到主分支到编译,都可以通过CI的feedback查看我们的测试结果以及测试过程,可以极大提高我们的工程效率,我们使用Gitlab runner结合Gitlab来做CI(持续集成),GitLab提供持续的集成服务,如果将.gitlab-ci.yml文件添加到存储库的根目录,并将GitLab项目配置为使用Runner,则每个PR或push都将触发CI Pipeline。我们主要掌握gitlab-ci.yml描述语法即可,这个文件告诉GitLab runner该怎么做,下面我们介绍Gitlab runner的部署和使用。
Gitlab Runner部署
kubernetes-runner
为什么要用 kubernetes-runner
-
官方支持的特性中 kubernetes 的特性是最全的.
- 可以充分利用kubernetes的优化特性,保证CI的稳定性和效率.
接入 Gitlab CI 需要做什么改造
如果没有使用Service的话,应该是和之前兼容可以直接忽略
有些服务的测试需要依赖MySQL,Redis等,因此需要service
在executor为Docker里面的service通信使用的是container link技术,核心原理就是动态修改docker的/etc/hosts,然后通过配置 特定的域名来进行通信.在使用kubernetes-runner,由于kubernetes的pod机制,可以共享网络,因此需要业务服务测试用例代码逻辑或配置项需要把域名改为127.0.0.1 即可 (127.0.0.1 应该更符合大家的认识)
Gitlab 使用
添加CI步骤
在gitlab项目中添加.gitlab-ci.yml脚本
image: hub.xxxxx.com/devops/alpine:3.7 #基于某个镜像构建job环境。
# 定义环境变量,作用域为当前.gitlab-ci文件
variables:
MYSQL_DATABASE: "test"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_ROOT_HOST: "%"
# docker client variables
DOCKER_DRIVER: overlay
DOCKER_HOST: tcp://localhost:2375
DOCKER_IMAGE_NAME: hub.xxxx.com/devops/test
services:
- mysql:5.7.17
- redis:3.2.9
# docker daemon
- docker:dind
stages:
- code_style
- test
- build
gofmt:
stage: code_style
script:
- gofmt -d $(find . -type f -name '*.go' -not -path "./*_test.go" -not -path "./vendor/*" -not -path "./_project/*")
# 测试
gotest:
stage: test
script:
- make deps
- make build
- make test
# TODO 编译打包以及制作镜像
docker:
stage: build
script:
- docker login hub.xxxxx.com -u "$HUB_LOGIN" -p "$HUB_PASSWORD"
- |
if [ "$CI_PROJECT_NAMESPACE" != "triones-core" ]; then
exit 0;
fi
# Build and upload docker image
DOCKER_IMAGE_TAG=$CI_COMMIT_TAG DOCKER_IMAGE_NAME=$DOCKER_IMAGE_NAME make docke
docker images
# Create docker tags for latest
docker tag "$DOCKER_IMAGE_NAME:$CI_COMMIT_TAG" "$DOCKER_IMAGE_NAME:latest"
docker push "$DOCKER_IMAGE_NAME"
artifacts:
## 可以把我们编译生成的二进制文件放在gitlab上面,供我们需要时下载。
paths:
- bin/
## 仅允许在打tag时候出发这个job
only:
- tags
# TODO 部署QA环境 生产环境