Gitlab CI 持续集成的完整实践
本着公司团队初创,又在空档期想搞点事情,搭建了私有Gitlab的契机,顺便把持续集成搭建起,实现了对Python服务端代码的单元测试、静态代码分析和接口测试的持续集成。总体架构如下:
执行过程:
开发提交代码后,自动触发gitlab-runner拉取executor镜像执行单元测试,单元测试代码中包含上传测试结果到x-utest测试平台;
单元测试通过后,gitlab-runner拉取sonar-scanner镜像执行静态代码分析,分析结果评论在commit中或保存于sonarqube;
静态代码分析结束,执行分发操作,将代码分发至灰度测试服务器,并运行;
执行接口测试,执行完成后上传测试结果到x-utest测试平台。
四个任务相互依赖,只在前一个任务状态为成功情况下才会执行。
Gitlab CI 基本配置
针对某个需要做CI/CD的项目,需要将代码库的该设置打开,并为其配置 gitlab-runner。
gitlab runner
gitlab-runner不仅可以运行在物理机,还可以运行在容器中。考虑到gitlab-runner消耗的资源少,使用容器更合适。
拉取gitlab-runner Docker 镜像:
sudo docker pull gitlab/gitlab-runner
启动容器:
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
在容器中执行register操作,将gitlab上的项目注册到gitlab-runner中:
sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
输入上述命令后会有一系列的配置需要输入,当然也可以设置完后进行更改 按照提示输入即可,前两项可以在指定项目设置中CI/CD选项里的Runners settings选项中的Specific Runners里看到,tags是gitlab-ci.yml文件中所要用到的,executor选择docker 配置成功后,我们可以在设置中CI/CD选项里的Runners settings选项中的Specific Runners里看到runner信息
本地executor镜像
为了部署与测试,需要一个镜像用于执行。当选用本地镜像时,可能会出现拉取镜像失败。
拉取镜像失败
报错的原因在于,gitlab-runner尝试去官方的docker hub仓库拉取镜像。通过修改gitlab-runner中的配置,设置只拉取本地镜像:
修改 /etc/gitlab-runner/config.toml ,在 [runners.docker]
下,添加:
pull_policy = never # 该配置默认always,即只在线上拉取镜像
如果有需要添加一些hosts映射,仍然在 [runners.docker]
下,添加:
extra_hosts = ["hostname:ip"]
另外为了加快单元测试执行速度,将服务端代码的依赖提前安装至executor镜像中:
COPY requirement.txt .
RUN pip install -r requirement.txt
编写 .gitlab-ci.yaml
单元测试部分
用nose执行测试
对于Python,nosetest工具可以嗅探与执行你写的所有测试用例,并输出结果。在执行测试前,使用nose需要使用pip安装
pip install nose
安装完成后,使用 nosetests
执行。
nosetests
自写测试入口
另一个执行测试的选择,是自写测试入口,不依赖nose。好处是能够将测试结果上传至x-utest。 对测试结果做判断,如果全部用例通过(即wasSuccessful为True),则sys.exit(0),否则sys.exit(1)
redis与mongo服务化
对于redis与mongo这种外部服务,有两种解决方式,一是mock对数据库的读写,二是使用服务化的redis与mongo,保证外部环境的一致性。(更推荐第一种方式,此处介绍第二种。)
由于设置了不从docker hub拉取镜像,因此需要先拉取redis与mongo服务镜像到本地
docker pull redis:2.8
docker pull mongo:3.2
在gitlab-ci.yaml中添加services:
services:
- redis:2.8
- mongo:3.2
修改代码的local_config配置文件中的mongo与redis连接URL,指向“mongo”与“redis”
静态代码分析
sonarqube搭建
制做了一个docker-compose项目可以一键部署SonarQube平台,使用postgres作为后端数据库,并将数据持久化在宿主机本地。
git clone https://github.com/ityoung/sonarqube-docker.git
pip install docker-compose
cd sonarqube-docker
docker-compose up
sonar scanner配置
同时针对Python开源了sonar-scanner镜像的Dockerfile ,该镜像已经安装pylint,方便做Python的静态代码分析。
git clone https://github.com/ityoung/sonar-scanner-docker.git
cd sonar-scanner-docker
docker build -t sonar-scanner .
YAML添加执行命令
启动SonarQube后,进入IP:9000到SonarQube管理页面,登录admin/admin,新建一个项目,按步骤执行完成
创建一个project
创建完成后,获取到执行代码,复制这段代码,添加到yaml中,能够实现分析结果上传到SonarQube。
获取sonar-scanner执行脚本
注意:如果yaml中用到了两个镜像,尽量不要有before_script,否则可能两个镜像,触发错误。
Sonar分析后评论
对于develop分支,可以不保存分析结果,而改为将分析结果评论在当次commit下。
在yaml脚本中添加如下参数:
- sonar-scanner
-Dsonar.analysis.mode=preview
-Dsonar.gitlab.commit_sha=$CI_BUILD_REF
-Dsonar.gitlab.ref_name=$CI_BUILD_REF_NAME
-Dsonar.gitlab.project_id=$CI_PROJECT_ID
注意:无新issue时默认不会评论,需要在SonarQube修改gitlab配置才会每次都评论。
持续交付
这部分交由对服务端部署更熟悉的运维操作。
接口测试
接口测试代码在另一个仓库,这就涉及到从另一个仓库clone测试代码时的权限问题。
给仓库URL添加token能够实现跨仓库clone代码:
git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.xxx.com/yx/apitest.git
附一:完整的.gitlab-ci.yml
image: pro1_executor stages:
- unittest
- analyze
- deploy
- apitest variables:
SONAR_HOST: "http://192.168.0.29:9000"
SONAR_PROJ: "pro_1"
SONAR_LOGIN: "b3135dd602b61ce7ff5f4202a3ec2ec0865fa7f5" services: - redis:
- mongo:3.2 UnitTest:
stage: unittest
script:
- pip install nose
- python -m runtest xtest Sonar_Preview:
image: sonar-scanner
stage: analyze
script:
- sonar-scanner
-Dsonar.analysis.mode=preview
-Dsonar.gitlab.commit_sha=$CI_BUILD_REF
-Dsonar.gitlab.ref_name=$CI_BUILD_REF_NAME
-Dsonar.gitlab.project_id=$CI_PROJECT_ID
-Dsonar.projectKey=$SONAR_PROJ
-Dsonar.sources=.
-Dsonar.host.url=$SONAR_HOST
-Dsonar.login=$SONAR_LOGIN
except:
- master Sonar_Analyze:
image: sonar-scanner
stage: analyze
script:
- sonar-scanner
-Dsonar.projectKey=$SONAR_PROJ
-Dsonar.sources=.
-Dsonar.host.url=$SONAR_HOST
-Dsonar.login=$SONAR_LOGIN
only:
- master Deploy_TestServer:
stage: deploy
script: echo "deploy" API_Test:
stage: apitest
script:
- cd /
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.xxx.com/yx/apitest.git
- cd apitest
- pip install -r requirements.txt
- python runtest.py
参考:
[1] https://mp.weixin.qq.com/s/fJPNg8jPkLAd0y8-D7xBYw
Gitlab CI 持续集成的完整实践的更多相关文章
-
Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务
Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...
-
Ubuntu Docker 安装和配置 GitLab CI 持续集成
相关文章: Ubuntu Docker 简单安装 GitLab 劈荆斩棘:Gitlab 部署 CI 持续集成 目的:在 Ubuntu 服务器上,使用 Docker 安装和配置 GitLab Runne ...
-
GitLab CI持续集成配置方案
目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...
-
GitLab CI持续集成配置方案(补)
上篇文章介绍了GitLab CI的持续集成配置方法,本篇文章将主要介绍NUnit的持续集成和遇到的一些坑 1.NUnit单元测试持续集成 下载NUnit.3.4.1.msi,https://githu ...
-
Gitlab CI持续集成 - GitLab Runner 安装与注册
GitLab Runner安装 需要添加gitlab官方库: # For Debian/Ubuntu/Mint curl -L https://packages.gitlab.com/install/ ...
-
[原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发.敏捷开发.迭代开发.持续集成和单元测试这些拉风的术语.然而,大都是仅仅听到在说而已,国内 ...
-
CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...
-
物联网架构成长之路(47)-利用GitLab实现CI持续集成
0.前言 前段时间,考虑到要练习部署一套CI/CD的系统.一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了.所以本次博客,干脆一步到位,直接用GitLa ...
-
【补充】Gitlab 部署 CI 持续集成
上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...
随机推荐
-
php配置参数.md
php 5.5 配置文件 php.ini Options user_ini.filename string 设定了 PHP 会在每个目录下搜寻的文件名:如果设定为空字符串则 PHP 不会搜寻.默认值是 ...
-
oracle 锁的介绍 (转)
本文转自:http://blog.csdn.net/gyb2013/article/details/6929697 一.什么是锁: Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行 ...
-
如何保持自己 fork 的项目和原始项目同步
首先先通过 github 的 web 页面 fork 目标的项目 前提是自己已经设置好了git,并且配置了相应的权限 然后使用git clone命令在本地克隆自己 fork 的项目: git clon ...
-
JDBC 与ODBC的区别
一.ODBC(Open DataBase Connectivity : 开放数据库连接) ODBC 总体结构 应用程序 执行处理并调用odbc函数,提交sql语 ...
-
【bzoj2938】[Poi2000]病毒
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
-
C#基础知识-流程控制的应用(四)
流程控制我们在编程中运用到的地方非常的多,在上篇中仅仅只是简单的介绍每一种的使用,并没有运用到实例中,很难去理解它真正的作用.下面我们将实际的运用流程控制的代码写一些实例相关的程序,加深对流程控制的理 ...
-
vue.js用法和特性详解
前 言 最近用Vue.js做了一个数据查询平台,还做了一个拼图游戏,突然深深的感到了vue的强大. Vue.js是一套构建用户界面(user interface)的渐进式框架.与其他重量级框架不 ...
-
thinkjs升级到3.0后的图片上传
似乎当thinkjs升级到3.0后,才接手了一个项目.只是在实际运用过程中,还是发现了与2.2的些许差别——今天先分享关于图片上传的一些问题. 1.上传文件,我们选择了jQuery的插件:http:/ ...
-
CQOI2019(十二省联考)游记
CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...
-
nagios 监控内存使用情况
监控本机内存cd /usr/lib64/nagios/pluginstouch check_mem.sh #!/bin/bash " ]; then memTotal_b=`free -b ...