文章

GitLab CI使用

CI/CD

CI:Continuous Integration,持续集成。即在代码构建过程中持续地进行代码的集成、构建、以及自动化测试等。有了 CI 工具,我们可以在代码提交的过程中通过单元测试等尽早地发现引入的错误。

CD:Continuous Delivery,持续交付。在代码构建完毕后,可以方便地将新版本部署上线,

CD:Continuous Deployment,持续交付。快速迭代并交付产品。

GitLab CI/CD

GitLab CI/CD是一套基于 GitLab 的 CI/CD 系统,可以让开发人员通过 .gitlab-ci.yml 在项目中配置 CI/CD 流程,在提交后,系统可以自动/手动地执行任务,完成 CI/CD 操作。而且,它的配置非常简单,CI Runner 由 Go 语言编写,最终打包成单文件,所以只需要一个 Runner 程序、以及一个用于运行 jobs 的执行平台(如裸机+SSH,Docker 或 Kubernetes 等,我推荐用 Docker,因为搭建相当容易)即可运行一套完整的 CI/CD 系统。

用白话来讲:CI/CD是GitLab自带的一套服务,在项目的根目录下面配置.gitlab-ci.yml文件,然后push代码(默认,可以用only控制触发的条件),GitLab就会自动去执行yml里面配置的脚本命令了。其中命令是执行在Runner(tags)程序中的(Setting->CI/CD->Runner),Runner会绑定一个IP,指向的是任务执行的平台(我用的Docker)。

所以GitLab CI/CD的关键部分是yaml文件和任务执行的脚本的编写,下面列出一个yaml的样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
stages:
  - test
  - analyze
  - variablestest

Test:
  stage: test
  script:
    - pwd
    - whoami
    - ls -la
    - curl  --request GET --header PRIVATE-TOKEN:8Fyc-q*********KMSoD --url  https://git.****ase.com/api/v4/projects/15**5/repository/files/test.py/raw\?ref\=master   -s| python3 -
  tags:
    - qiujunyun-ci-runner1
  only:
    - pushes
  allow_failure: true  
  artifacts:
    expire_in: 1 week
    paths:
        - test.json

Analyze:
  stage: analyze
  script:
    - pwd
    - curl  --request GET --header PRIVATE-TOKEN:8Fyc-q*********KMSoD --url  https://git.****ase.com/api/v4/projects/15**5/repository/files/test2.py/raw\?ref\=master   -s| python3 -
  tags:
    - qiujunyun-ci-runner1

Variable:
  stage: variablestest
  script:
    - echo "GITLAB_USER_LOGIN=$GITLAB_USER_LOGIN!"
    - echo "CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH!"
    - echo "CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME!"
    - echo "CI_MERGE_REQUEST_TARGET_BRANCH_NAME=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME!"
    - echo "CI_MERGE_REQUEST_IID=$CI_MERGE_REQUEST_IID!"
  tags:
    - qiujunyun-ci-runner1

随意git push一条提交触发CI/CD如下

Pipeline:

Pipeline

Pipeline线状图

Jobs:

Jobs

点击查看job的详情:

Job详情

从搭建环境开始一步步教你使用GitLab CI/CD

安装Docker

最开始安装Docker其实我是想搭建自己的GitLab,最后搭建起来页面打开经常502,内存不够撑不起来。

在Mac上安装docker官方教程:安装docker

首先你需要简单的了解下,什么是Docker

介绍

我知道虚拟机,但是不了解Docker。最开先了解虚拟机,它是让window中能模拟一个linux操作系统。而Docker其实就是这样的另一种虚拟化技术:Linux容器(Linux Containers),演变而来的。

软件开发过程中,最麻烦的事情之一就是环境配置。常常会说的一句话就是:”它在我的机器可以跑了”,而在其他人的机器(环境)上就没法跑了。环境配置如此麻烦,换一台机子就得重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

然后虚拟机就是但环境安装的一种解决方案。但是缺点也多:资源占用多、冗余步骤多、启动慢。

基于虚拟机的这么多缺点,Linux容器诞生了,另一种虚拟化技术。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势:启动快、暂用资源少、体积小。

Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

用途

Docker 的主要用途,目前有三大类。

1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

2. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

3. 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

开始安装

我这里选择安装的是Docker Mac的桌面工具,Install Docker Desktop on Mac

  1. 下载dmg安装包

  2. 安装好Docker.app到Applicatioins中
  3. 点击打开运行即可

如果想通过docker安装自己的gitlab服务,可以参考文章

安装Runner

Runner在Setting->CI/CD->Runners中。我配置的如下,图一:

Runners

点击展示详情如下,图二:

Runners Detail

开始安装

  1. Install the Docker image and start the container,使用本地系统卷挂载启动Runner容器
1
2
3
4
docker run -d --name gitlab-runner --restart always \
     -v /Users/rambo/srv/gitlab-runner/config:/etc/gitlab-runner \
     -v /var/run/docker.sock:/var/run/docker.sock \
     gitlab/gitlab-runner:latest
  1. 注册Runner,macOS环境
    1. 执行命令gitlab-runner register,接着需要让你确认一些输入
    2. 输入GitLab的URL(gitlab-ci coordinator URL),在Setting->CI/CD->Runners的Set up a specific Runner manually的第二条就是,见上图一
    3. 输入token,在Setting->CI/CD->Runners的Set up a specific Runner manually的第三条就是,见上图一
    4. 输入描述,展示在runner详情中,见上图二
    5. 输入tags,自定,到时会用在yml文件中,用逗号分割
    6. 提供一个Runner Executor,我这里用的是docker
    7. 提供默认的镜像,我这里输入的是默认的ruby 2.7
  2. Done,这样你就能看到GitLab里面设置的runner了。

编写yml和执行脚本

编写.gitlab-ci.yml都根据自己的项目实际情况进行编写。

  1. 开发可以根据需求编写:代码风格分析、提交message规范、埋点分析、代码重复率分析、未引用文件分析、引用但未使用分析、重复资源分析、警告分析、以及输出这些分析报告。
  2. QA可以编写打包脚本,通过trigger的方法触发打包,等等使用方式。使用trigger触发ci

这里介绍一种,将执行脚本和主工程分开管理的方式,主要是通过GitLab API的使用来实现,获取并执行。

CI/CD的运行脚本工程进行剥离

项目目录

两个项目的目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
hzqiujunyun/Demo:
  - .git
  - .gitlab-ci.yml
  - Demo
  - Demo.xcodeproj
  - Podfile
  - Podfile.lock
  - Demo.xcworkspace
  - README.md
hzqiujunyun/mobile-ci:
  - gitlab-ci.yml
  - test.py
  - test2.py

其中工程Demo中的.gitlab-ci.yml文件编写如下,使其指向mobile-ci中

1
2
3
4
include:
  - project: 'hzqiujunyun/mobile-ci'
    file: 'gitlab-ci.yml'
    ref: master

当然如果还有另一个ci工程,可以再加一个project,如下,额外的打包相关的ci

1
2
3
4
5
6
7
8
include:
  - project: 'hzqiujunyun/mobile-ci'
    file: 'gitlab-ci.yml'
    ref: master

  - project: 'qa/ci-operator'
    file: 'gitlab-ci.yml'
    ref: master

mobile-ci项目

gitlab-ci.yml见文章开头,主要讲解下如下几点:

  1. curl调用并执行python脚本

    这里有个知识点,使用GitLab API来调用我们编写的python脚本。GitLab API使用

    1
    
    curl  --request GET --header PRIVATE-TOKEN:8Fyc*********GKMSoD --url  https://git.****ase.com/api/v4/projects/****/repository/files/test.py/raw\?ref\=master   -s| python3 -
    

    一行命令搞定下载脚本到本地并运行

  2. python脚本参数传递,使用geopt.getopt()去获取参数(短选项和长选项)

    sys.argv和getopt.getopt()的用法

    getopt在Python中的使用

    getopt — C 风格的命令行选项解析器

可实现能力

Pod依赖变更分析 - 对比分析Podfile.lock文件

无用埋点配置检查 - 全局搜索字符串是否有再其他地方使用

编码风格规范检查 - 使用clang-format

commit提交信息的规范检查 - 获取所有的commit,正则表达式进行匹配计算

代码重复率分析 - 使用的jscpd

未引用的文件分析 - 使用命令find ./NeteaseYanxuan -name "*.m" -exec basename '{}' \; | xargs -I '{}' sh -c 'grep "{} in Sources" NeteaseYanxuan.xcodeproj/project.pbxproj > /dev/null; echo "$?\c"; echo " {}"' | grep "^1"

重复资源分析 - md5存入字典key,进行.jpg .png .m文件对比

生成编译文件 - xcodebuild

警告分析 - 利用编译文件,检索warning cat %sgrep ⚠️

信息发送到飞书或是钉钉

参考文章

感谢这些文章的主人

GitLab API使用 GitLab API Docs GitLab中文文档

GitLab CI/CD 基础教程 Setting up GitLab CI for iOS projects GtLab CI/CD 工具介绍 Gitlab-CI使用教程

gitlab runner

一行命令搞定下载脚本到本地并运行

sys.argv和getopt.getopt()的用法

getopt在Python中的使用

Docker 入门教程

安装docker

使用docker安装gitlab

Xcodebuild

使用trigger触发ci

飞书开放平台

本文由作者按照 CC BY 4.0 进行授权