搜索
简帛阁>技术文章>Gitlab_CI/CD详细过程

Gitlab_CI/CD详细过程

一、GitLabRunner服务器安装Docker和GitLabRunner环境

(一)、增加GitlabRunner用户以及Docker用户组

  1. 增加GitlabRunner用户
# 增加gitlab-runner用户
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# 修改组目录权限
sudo chmod -R 766 /home/gitlab-runner
# 使用setfacl设置权限(可选)
sudo setfacl -m d:user:gitlab-runner:rwx
sudo setfacl -m group:other:rww
  1. 增加Docker用户组,并将gitlab-runner用户加入Docker用户组(实现不用sudo 启动docker)
sudo groupadd docker
sudo usermod -aG docker gitlab-runner

(二)、安装Docker依赖环境

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

(三)、使用阿里源安装Docker

  1. 需要添加软件源的 GPG 密钥
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 修改sources.list 中添加 Docker 软件源
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 官方源
# $ echo \
#   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
#   $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 开启Docker
sudo systemctl enable docker
sudo systemctl start docker

(四)、设置Docker镜像源并重启Docker

  1. vi /etc/docker/daemon.json 增加镜像地址
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "insecure-registries": ["192.168.1.213:8086"],
  "live-restore": true
}
  1. 让配置生效并重启docker
systemctl daemon-reload
systemctl restart docker

(五)、安装GitLabRunner服务

  1. 下载GitLabRunner
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
  1. 修改执行文件权限
sudo chmod +x /usr/local/bin/gitlab-runner
  1. 安装和运行GitLabRunner服务
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

二、GitLabRunner服务器注册Runner

  1. 使用GitLabRunner的命令在本服务器注册一个Runner
# url 为Gitlab的地址,token为Gitlab中可在具体的一个项目中的设置>>CI/CD>Runner中提示的值
sudo gitlab-runner register  --url http://192.168.1.26:9980 --registration-token cJMXGJWx7qx9AmpSc6ee 

a. 项目中


a. 群组中的设置


具体的项目中注册的Runner默认会只对当前项目有效,如果要共享给其他项目,就需要进入GitLab界面编辑Runner,去掉“锁定当前项目”的勾选

2.选择执行器并配置相关信息

a. 运行了上面的 gitlab-runner register 命令后会提示选择使用那一种Runner执行器,这里我们选择Shell

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

b. 然后会让输入执行器对应的Tag。这里的Tag的值是和.gitlab-ci.yml中的tags是对应的。也可以通过在GitLab的界面中修改Runner的Tag值。

三、配置免密登陆和Scp拷贝

配置GitLabRnner服务所在服务器与发布的目标服务器之间的免密登陆

(一)、生成公私钥

在GitLabRnner服务所在服务器通过以下命令切换到gitlab-runner用户,并进入/home/gitlab-runner目录,运行ssh-keygen命令生成公私钥

sudo su gitlab-runner
cd /home/gitlab-runner
ssh-keygen -t rsa -C "xxxx@163.com"

(二)、拷贝公钥到目标服务器

将上一步生成的公钥拷贝到目标服务器对应用户的主目录下的./ssh/authorized_keys文件中。有两种方式
第一种:自己在目标服务器通过vi 打开authorized_keys文件,把公钥拷贝到其中,并保存
第二种:通过下面的命令进行拷贝

ssh-copy-id -i ~/.ssh/id_rsa.pub userxxxxx@192.168.xx.xx

(三)、测试免密登陆和scp拷贝

通过以下命令测试免密登陆和scp免密拷贝,如果没有要求输入对应用户的密码,即为成功

ssh userxxxxx@192.168.xx.xx
scp -o StrictHostKeyChecking=no /home/gitlab-runner/xxxx/xxxx.jar userxxxxx@192.168.xx.xx

如果仍然需要输入密码,请尝试修改authorized_keys这个文件的权限为600,并重启sshd(sudo chmod ~/.ssh/authorized_keys 600 && /etc/init.d/sshd restart)

四、定义流水线文件.gitlab-ci.yml

# stage步骤,一个流水线需要经过的步骤
stages:
  - build
  - deploy

#job's name 可以随意取
buildJar:
  stage: build
  only:
   # 指定只对某个分支的代码触发
    - dev
  script:
#    package 已包含 test 步骤,所以流程中不需要另外配置test job
    - export curPath=$(pwd)
    - docker run -i --rm -v $curPath:/usr/src/projectxxxx -w /usr/src/projectxxxx maven:3.3-jdk-8 mvn clean package
  tags:
    - maven_tag
  artifacts:
    #是job生成的中间产物,会以压缩包(.zip)的形式生成。它会自动上传到gitlab服务器
    paths:
      - target/admin.jar
deploy files:
  stage: deploy
  only:
    - dev
  script:
    - scp -o StrictHostKeyChecking=no userxxxxx@192.168.xx.xx:/home/userxxxxx/target/admin.jar 
  tags:
    - maven_tag

其他示例

stages:
  - build jar
  - build and run image

#job's name 可以随意取
buildJar:
  stage: build jar
  variables:
    # 默认是clone,改为fetch加快拉取速度(若本地无则会自动clone)
    GIT_STRATEGY: fetch
  only:
    - dev
  script:
    - >
      docker run -d --rm --name justforpackage-$CI_COMMIT_REF_NAME
      -v "$(pwd)":/build/inkscreen
      -v /inkscreen/maven/m2:/root/.m2
      -w /build/inkscreen
      maven:3-jdk-8 mvn clean package

    - sleep 60
  tags:
    - inkscreen_hostrunner
  artifacts:
    paths:
      - louwen-admin/target/louwen-admin.jar
    expire_in: 3600 seconds

testDeploy:
  stage: build and run image
  only:
    - dev
  variables:
    # 不拉取代码
    GIT_STRATEGY: none
    IMAGE_NAME: louwen/inkscreen-api:$CI_COMMIT_REF_NAME
    PORT: 38082
  before_script:
    # 移除旧容器和镜像。这里为什么要写成一行,下面有讲
    - if [ docker ps | grep inkscreen-$CI_COMMIT_REF_NAME ]; then docker stop inkscreen-$CI_COMMIT_REF_NAME; docker rm inkscreen-$CI_COMMIT_REF_NAME; docker rmi $IMAGE_NAME; fi
  script:
    - docker build --build-arg JAR_PATH=louwen-admin/target/louwen-admin.jar -t $IMAGE_NAME .
    - >
      docker run -d --name inkscreen-$CI_COMMIT_REF_NAME
      -p $PORT:$PORT
      --network my_bridge --env spring.redis.host=myredis
      -v /inkscreen/inkscreen-api/logs/:/logs/
      -v /inkscreen/inkscreen-api/louwen-admin/src/main/resources/:/configs/
      $IMAGE_NAME
  tags:
    - inkscreen_hostrunner

.gitlab-ci.yml配置参数

关键词	描述
script	必选参数,指定runner运行的脚本(如 npm run build)
image	需要在docker中使用到的环境镜像(如 node:8.11.2)
services	需要的service镜像
before_script	作业执行前需要执行的命令
after_script	作业执行后需要执行的命令
stages	定义流水线所有的阶段
stage	定义作业所处流水线的阶段(默认test阶段)
only	限制作业在什么时候创建运行(比如是某个分支、某个tag等)
except	限制作业在什么时候不创建运行
tags	作用使用的Runner运行器的标签列表
allow_failure	允许作业失败,失败的作业不影响提交的状态
when	指定什么时候运行作业
environment	部署的环境
cache	指定需要在job之间缓存的文件或目录
artifacts	归档文件列表,指定成功后应附加到job的文件和目录的列表
dependencies	当前作业依赖的其他作业,你可以使用依赖作业的归档文件
coverage	作业的代码覆盖率
retry	作业失败时,可以自动尝试的次数
parallel	指定并行运行的作业实例
trigger	定义下游流水线的触发器
include	作业加载其他YAML文件
extends	控制实体从哪里继承
variables	定义环境变量

参考文章

官方中文文档
GitLab-CI/CD入门实操
GitLabCI的流水线实践
当谈到 GitLab CI 的时候,我们该聊些什么(上篇)
当谈到 GitLab CI 的时候,我们都该聊些什么(下篇)
Docker安装Gitlab和Gitlab-Runner并实现项目的CICD
Gialab YMAL 原文地址
Gitlab CI yaml官方配置文件翻译
gitlab-ci配置详解(一)
gitlab-ci配置详解(二)

Docker中国区官方镜像
https://registry.docker-cn.com

网易
http://hub-mirror.c.163.com

ustc 
https://docker.mirrors.ustc.edu.cn

中国科技大学
https://docker.mirrors.ustc.edu.cn

https://iccdq93l.mirror.aliyuncs.com
Docker、Gitlab、阿里云镜像仓库、SpringBoot的相关安装、搭建这里就不讲了。Linux安装Docker:https://wwwcnblogscom/linnuo/p/15587902
cd:切换目录(changedirectory)cd~USERNAME:进入指定用户的家目录:在当前目录和前一次所在的目录之间来回切换p:如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的
CI(ContinuousIntegration):持续集成不断把本地代码汇集到软件整体的过程简单说即:服务打包;问题:单次构建单服务还是多服务?多服务:构建简单,管理复杂,小修改全部要更新;单服务:
cd进入用户主目录;cd~进入用户主目录;cd返回进入此目录之前所在的目录;cd返回上级目录(若当前目录为“/“,则执行完后还在“/;为上级目录的意思);cd/返回上两级目录;cd!$把上个命令的参数
什么是CI/CDCI(ContinuousIntegration),就是持续集成,借助工具对软件项目持续自动化的编译打包构建测试发布,用来检查软件交付质量。CD(ContinuousDeploymen
一资源申请可参考如下格式:Dearall:测试部**项目资源申请,信息如下:1中文名:研发应用一部开发资源,英文名:feitian2项目最低资源需求:cpu:5、memory:5g3GitLabGro
之前发布开源项目PaymentSpringBoot到Maven中央仓库我都是手动执行mvndeploy,在CI/CD大行其道的今天使用这种方式有点“原始”。于是我一直在寻求一种能够支持流水线作业的发布
cd进入用户主目录cd~进入用户主目录cd返回进入此目录之前所在目录cd返回上一级目录cd/返回上两级目录cd!$把上个命令的参数作为cd参数使用cd/进入根目录cd当前目录
cd命令的作用:进入磁盘的某个目录下。[root@node5~]cd/etc/sysconfig/networkscripts/[root@node5networkscripts]pwd/etc/sy
持续集成ContinuousIntegration持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进行自动化测试持续交付ContinuousDelivery持续交付指的是在持续