Gitlab CI 持续集成的完整实践

本着公司团队初创,又在空档期想搞点事情,搭建了私有Gitlab的契机,顺便把持续集成搭建起,实现了对Python服务端代码的单元测试、静态代码分析和接口测试的持续集成。总体架构如下:

执行过程:

  1. 开发提交代码后,自动触发gitlab-runner拉取executor镜像执行单元测试,单元测试代码中包含上传测试结果到x-utest测试平台;

  2. 单元测试通过后,gitlab-runner拉取sonar-scanner镜像执行静态代码分析,分析结果评论在commit中或保存于sonarqube;

  3. 静态代码分析结束,执行分发操作,将代码分发至灰度测试服务器,并运行;

  4. 执行接口测试,执行完成后上传测试结果到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 持续集成的完整实践的更多相关文章

  1. Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务

    Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...

  2. Ubuntu Docker 安装和配置 GitLab CI 持续集成

    相关文章: Ubuntu Docker 简单安装 GitLab 劈荆斩棘:Gitlab 部署 CI 持续集成 目的:在 Ubuntu 服务器上,使用 Docker 安装和配置 GitLab Runne ...

  3. GitLab CI持续集成配置方案

    目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...

  4. GitLab CI持续集成配置方案(补)

    上篇文章介绍了GitLab CI的持续集成配置方法,本篇文章将主要介绍NUnit的持续集成和遇到的一些坑 1.NUnit单元测试持续集成 下载NUnit.3.4.1.msi,https://githu ...

  5. Gitlab CI持续集成 - GitLab Runner 安装与注册

    GitLab Runner安装 需要添加gitlab官方库: # For Debian/Ubuntu/Mint curl -L https://packages.gitlab.com/install/ ...

  6. [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发.敏捷开发.迭代开发.持续集成和单元测试这些拉风的术语.然而,大都是仅仅听到在说而已,国内 ...

  7. CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...

  8. 物联网架构成长之路(47)-利用GitLab实现CI持续集成

    0.前言 前段时间,考虑到要练习部署一套CI/CD的系统.一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了.所以本次博客,干脆一步到位,直接用GitLa ...

  9. 【补充】Gitlab 部署 CI 持续集成

    上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...

随机推荐

  1. [noip2017] 前三周总结

    [noip2017] 前三周总结 10.20 Fri. Day -21 距离noip复赛还有3周了,进行最后的冲刺! 首先要说今天过得并不好,和我早上比赛打挂了有关系. 不过每一次比赛都能暴露出我的漏 ...

  2. MapRedcue的demo(协同过滤)

    MapRedcue的演示(协同过滤) 做一个关于电影推荐.你于你好友之间的浏览电影以及电影评分的推荐的协同过滤. 百度百科: 协同过滤简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣 ...

  3. java基础---->Serializable的使用

    本次讲解中我们建立一个Java的项目去体会一下序列化Serializable的使用,序列化的原理以及序列化的自定义请参见我的另外一篇博客(java高级---->Serializable序列化的源 ...

  4. vim 插件 -- ctags

    vim ctags 插件实现代码跳转的功能.希望在一个项目中快速的找到函数,变量,宏等定义的地方. 下载 http://ctags.sourceforge.net/ 安装 tar -jxvf ctag ...

  5. 【协议逆向工程】Part 1 概述

    1 协议逆向工程概述 1.1 协议 协议是计算机网络与分布式系统中各种通信实体键相互交互信息时必须遵守的一组规则和约定,这些规则明确规定了所交换的数据格式以及有段的同步问题,从而保证了双方通信有条不紊 ...

  6. Debian/Ubuntu/Deepin下AndroidStudio2/3打开AVD模拟器无反应

    Debian系AS无法启动模拟器 问题描述 早在半年前将开发环境从windows迁移到了Linux:当时用的是Debian系统,也是在安装完成AndroidStudio之后无法开启模拟器,也没出现什么 ...

  7. MySQL的BLOB类型(解决mysql不支持mb4编码的时候存储emoji表情问题)

    今天在存储emoji表情的时候,发现无法存储,mysql版本太低也没办法使用uft8mb4格式编码,只能将数据字段设置为blob BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型 ...

  8. 8.7 C++二进制文件读写操作

    参考:http://www.weixueyuan.net/view/6413.html 总结: 二进制文件的读写稍微麻烦一些,对二进制文件的读写同样需要打开文件和关闭文件,打开和关闭方式与文本文件相同 ...

  9. linux 基础测试题

    1. 什么是buffer和cache buffer (cpu→内存→磁盘,简称为写缓冲 ):当你网上观看视频且网络波动较大的时候,会发现弹出一个正在缓冲中,这个就是buffer. cache(磁盘→内 ...

  10. VS遇到的问题记录

    Q:id为xxxx的进程当前未运行 A:将端口改掉.