本文是关于GItlab CI/CD的自动部署方案

GitLabCI/CD工作原理

  • 将代码托管到Git存储库
  • 在项目根目录创建ci文件.gitlab-ci.yml,在文件中指定构建、测试和部署脚本
  • GitLab将检测到它并使用名为GitLab Runner的工具运行脚本
  • 脚本被分组为作业,它们共同组成一个管道

运行效果:

image-20220904095646489

首先什么我们要知道Gitlab是什么

是一种类似github的服务,组织可以使用它来提供git存储库的内部管理。 它是一个自我托管的Git-repository管理系统,可以保持用户代码的私密性,并且可以轻松地部署代码的更改。

GitLab安装

  • 检查配置
1
2
3
4
5
6
7
8
9
10
11
The following is the recommended minimum CPU hardware guidance for a handful of example GitLab user base sizes.

4 cores is the recommended minimum number of cores and supports up to 500 users
8 cores supports up to 1000 users

The following is the recommended minimum Memory hardware guidance for a handful of example GitLab user base sizes.

4GB RAM is the required minimum memory size and supports up to 500 users
8GB RAM supports up to 1000 users

一般来说,两核八GB就够用了
1
2
3
4
5
6
7
查询cpu指令
cat /proc/cpuinfo
查询内存指令
cat /proc/meminfo
查询Linux内核版本
cat /proc/version
友情提示:如果是一核两G不用试了
  • 使用rpm包安装
1
2
3
4
5
6
7
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/e17/gitlab-ce-15.3.2-ce.0.el7.x86_64.rpm
rpm -ivh gitlab-ce-15.3.2-ce.0.el7.x86_64.rpm

vim /etc/gitlab.rb #编辑站点地址

gitlab-ctl reconfigure #配置

1
2
3
4
5
6
7
8
>启动
gitlab-ctl start
状态
gitlab-ctl status
>停止
gitlab-ctl stop
>重启
gitlab-ctl restart

另外docker安装和kubernetes安装就不赘述了

GitLab Runner介绍相关

GitLab Runner简介:

  • GitLab Runner是一个开源项目,用于运行作业并将结果发送GitLab
  • 与GitLabCI结合使用,GitLabCI是GitLab随附的用于协调作业的开源持续集成服务
  • GitLab Runner是用Go编写的,可以在Linux,macOS和Windos操作系统上运行
  • 容器部署需使用最新Docker版本。
  • 可以根据配置需要配置任意数量的Runner

Runner特点:

  • 作业运行控制:同时执行多个作业

  • 作业运行环境:

    1. 在本地、使用Docker容器、使用Docker容器并通过SSH执行作业
    2. 使用Docker容器在不同的云和虚拟化管理程序上自动缩放
    3. 连接到远程SSH服务器
  • 自动重新加载配置,无需重启

  • 易于安装,可作为Linux,macOS和Windos的服务

GitLab Runner类型与状态

  • 类型:
    • shared 共享类型,运行整个平台项目的作业
    • group项目组类型,运行特定group下所有项目的作业
    • specific项目类型,运行指定的项目作业
  • 状态
    • locked:锁定状态,无法运行项目作业
    • paused:暂停状态,暂时不会接受新的作业

image-20220903215422460

GitLab Runner安装相关

包管理工具

1
2
3
4
5
6
7
8
9
10
11
12
13
Add the official GitLab repository 添加官方仓库
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

Install the latest version of GitLab Runner, or skip to the next step to install a specific version 安装最新版本或者下一步
sudo yum install gitlab-runner

To install a specific version of GitLab Runner:安装指定版本
yum list gitlab-runner --showduplicates | sort -r
sudo yum install gitlab-runner-10.0.0-1

更新runner
sudo yum update
sudo yum install gitlab-runner

GitLab Runner注册

获取shared类型runnertoken

进入系统设置->Runners

image-20220904160532695

同理也可以找到对应得group CI/CD Runner和单项目得CI/CD Runner

1
2
3
4
/usr/local/bin/gitlab-runner register --locked="false"

#向GitLab-CI注册一个Runner需要两样东西:
GitLab-CI的url和注册token。 其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。 如果要注册Shared Runner,你需要到管理界面的Runners页面里面去找注册token。如下图所示

image-20220903215549856

GitLab CI/CD支持的执行器有很多种,最常用的是Docker, shell,Kubernets三种。

Shell 是最易于配置的执行器。构建中所需的依赖得你手工装在 Runner 所在机器上。

更好的方式是使用 Docker,它让你拥有干净的构建环境,以及简易的依赖管理——所有的编译项目所需的依赖都可以放进 Docker 镜像中。Docker 执行器很容易就能创建带有依赖服务的编译环境,比如 MySQL。

1
2
3
4
5
6
7
8
9
10
11
docker run --rm -v v/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \
--url "url" \ # 网页端域名
--registration-token "token" \ # gitlab提供的token
--description "first-register-runner" \
--tag-list "test-cicd1,dockercicd1" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"

.gitlab-ci.yml文件

如何检查你的yml文件是否符合,可以用CI Lint

image-20220904164146671

Pipeline语法

1.Job

在.gitlab-ci.yml的文件中,可以定义一个或多个作业(job)。每个作业必须具有唯一的名称(不能使用关键字),每个作业是独立执行。作业定义了在约束条件下进行相关操作,每一个作业至少要包含至少一个script

1
2
job1:
script: "execute-script-for-job1"

2.script

1
2
3
4
job:
script:
- uname -a
- bundle exec rspec

有时,script命令将需要用单引号或双引号引起来。例如,包含冒号命令(:)需要加引号,以便被包裹的YAML解析器知道来解释整个事情作为一个字符串,而不是一个”键:值”对.使用特殊字符时要小心: ,{,},[,], , 等等

3.before_script

跟script差不多,只不过在作业之前运行,如果失败则整个任务失败,作业失败不会影响after_sciprt

4.stages

用于定义作业可以使用的阶段,并且是全局定义的。同一阶段的作业并行运行,不同阶段按顺序执行

1
2
3
4
5
stages:
- build
- test
- codescan
- deploy

5. .pre&.post

.pre始终是整个管道的第一个运行阶段, .post始终是整个管道的最后一个运行阶段。用户定义的阶段都在两者之间运行。.pre和.post的顺序无法更改。如果管道仅包含.pre或.post阶段的作业,则不会创建管道

1
2
3
4
5
6
7
8
codescan:
stage: .pre
tags:
- build
only:
- master
script:
- echo "codescan"

6.tags(指定runner)

用于从允许运行该项目的所有Runner列表中选择特定的Runner,在Runner注册期间,您可以指定Runner标签

7.allow_failure允许失败

allow_failure允许作业失败,默认值为false。启用后,如果作业失败,将会在用户界面中显示橙色警告。但是,管道的逻辑流程将认为作业成功/通过,并且不会阻塞。假设所有其他作业均成功,则该作业的阶段及其管道将显示相同的橙色警告。但是,关联的提交将被标记”通过”,而不会发出警告。

1
2
3
4
5
job:
stage: test
script:
- execute
allow_failure: true

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
41
42
43
44
45
46
variables:
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -s .m2/settings.xml"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
PACKAGE_NAME: "certificate.jar"
PACKAGE_BACK_NAME: "certificateBack.jar"
PROD_ENV_1: "10.166.41.101"
image: maven:3.8.1-openjdk-11

stages:
- build
- deploy

cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .m2/repository
- sacc/target/


build:
stage: build
script:
- 'cd sacc'
- 'mvn $MAVEN_CLI_OPTS package -Dmaven.test.skip=true -Pprod'
- 'ls -al'
- 'ls -al target'
only:
- master


deploy-prod:
stage: deploy
script:
- 'mkdir -p ~/.ssh && chmod 700 ~/.ssh/'
- 'echo "$SSH_PRIVATE_KEY" >> ./id_rsa && chmod 600 ./id_rsa'
- 'echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- 'ls -al sacc/target'
- 'ssh -i ./id_rsa root@$PROD_ENV_1 "yum install net-tools"'
- 'ssh -i ./id_rsa root@$PROD_ENV_1 "/bin/cp -rf /opt/webapps/certificate/$PACKAGE_NAME \"/opt/webapps/certificate/$PACKAGE_NAME.$(date +\"%y%m%d\")\""'
- 'scp -i ./id_rsa -r sacc/target/$PACKAGE_NAME root@$PROD_ENV_1:/opt/webapps/certificate/$PACKAGE_NAME'
- 'ssh -i ./id_rsa root@$PROD_ENV_1 "cp /dev/null /opt/webapps/certificate/nohup.out"'
- "ssh -i ./id_rsa root@$PROD_ENV_1 \"pkill -f certificate.jar\""
- 'ssh -i ./id_rsa root@$PROD_ENV_1 "nohup java -jar /opt/webapps/certificate/certificate.jar &> /opt/webapps/certificate/nohup.out &"'
only:
- master