在 gitlab 中玩转 CI/CD

2,080 阅读6分钟

什么是CI/CD

持续集成(CI)和持续部署(CD)是DevOps中重要的两个环节,传统的软件开发和交付方式正在迅速变得过时,过去软件迭代与开发里,大多数公司的软件发布周期是每月、每季度甚至每年,较长的周期不利于产品的试错以及敏捷开发,而现在,DevOps 时代,每周、每天甚至每天多次都是常态。

开发团队通过编写软件交付流水线(Pipeline)代码实现版本构建,发布的自动化,以快速进行验证和缩短交付周期,更少的去关注部署以及发布的细节,而将更多的精力留在代码质量本身。

在实际使用中,g是开发者通过在itlab的CI/CD离预先配置的一系列pipeline参数,精心掌控触发时机,在代码提交、合并、或者打tag时,触发响应的自动构建流来完成构建到发布的动作。

GitLab CI/CD 是如何工作的

为了使用GitLab CI/CD,你需要一个托管在GitLab上的应用程序代码库,并且在根目录中的.gitlab-ci.yml文件中指定构建、测试和部署的脚本。

在这个文件中,你可以定义要运行的脚本,定义包含的依赖项,选择要按顺序运行的命令和要并行运行的命令,定义要在何处部署应用程序,以及指定是否 要自动运行脚本或手动触发脚本。

为了可视化处理过程,假设添加到配置文件中的所有脚本与在计算机的终端上运行的命令相同。

一旦你已经添加了.gitlab-ci.yml到仓库中,GitLab将检测到该文件,并使用名为GitLab Runner的工具运行你的脚本。该工具的操作与终端类似。

这些脚本被分组到jobs,它们共同组成一个pipeline。一个最简单的.gitlab-ci.yml文件可能是这样的:

before_script: 
  - apt-get install rubygems ruby-dev -y 

run-test: 
  script: 
    - ruby --version 6

20210404014040

任务目标

20210330104247

我们的任务目标是搭建一个 gitlab + gitlab-runner 的CICD环境,在代码触发时,启动构建动作,构建完毕后将代码推送到应用服务器上进行部署

应用服务是是一个具备nginx的服务,他暴露了80端口允许你访问端口,应用我们选择前端的 hexo 博客系统,开箱即用

准备

为了实现本文档的目标任务,需要做一下软件的前期准备

  • 安装docker
  • 了解docker常用操作
  • apt 软件安装操作

为了加快实践操作,你可能还会需要

  1. 安装docker WSL2
  2. 配置镜像加速源(可以自己申请阿里的一个镜像服务,免费的,或者直接使用下面的配置)

20210404013450

{
  "registry-mirrors": [
    "https://gk9l8m3a.mirror.aliyuncs.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}
  1. apt update/ install 都会比较耗时,可以尝试安装镜像源

相关材料

  1. docker安装gitlab
  2. docker四种网络模式,容器localhost访问宿主机端口
  3. linux 安装 nodejs
  4. linux软连接
  5. 安装 gilab-runner
  6. Job artifacts

环境准备

从安装一个 gitlab 开始

首先我们在docker安装一个gitlab用来做本次实验

# 下载镜像
docker pull gitlab/gitlab-ee

# 启动
docker run -d \
  --hostname localhost \
  -p 80:80 \
  --name gitlab \
  gitlab/gitlab-ee:latest

# 查看日志
docker logs -f gitlab

启动阶段要做较多的初始化工作,需要耐心等待。完成后可以通过 80 端口看到gilab。

20210330151758

  • 首次登陆需要重置密码,重置密码后即可进入系统

安装并注册 git runner

安装好 gitlab 后还要安装 gitlab-runner 并注册,gitlab-runner 主要用于响应 gitlab CI/CD,CI/CD里面的script脚本将会被 gitlab-runner 所执行

docker pull gitlab/gitlab-runner

# --network host 共享主机网络保证gitrunner能够正确的访问gitlab
docker run -d \
    --name gitlab-runner \
    --network host \
    gitlab/gitlab-runner:latest

# 命令模式进入容器
docker exec -it gitlab-runner bash

进入容器控制台,输入如下命令进行注册

gitlab-ci-multi-runner register

注册时需要一个token参数,可以访问 http://localhost/admin/runners 这个页面去获取

20210328171907

> gitlab-ci-multi-runner register

Runtime platform arch=amd64 os=linux pid=63 revision=943fc252 version=13.7.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
> http://localhost/

Enter the registration token:
> Q1L_vwDETgx8Fx-Yypfp

Enter a description for the runner:
[23229cabbaf2]: demo
Enter tags for the runner (comma-separated):

Registering runner... succeeded                     runner=Q1L_vwDE
Enter an executor: docker-ssh, virtualbox, kubernetes, docker-ssh+machine, custom, docker, parallels, shell, ssh, docker+machine:
> shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 
  • URL 填写 http://localhost/
  • token 从 gitlab 获取
  • name 随意
  • 不要为 runner 指定 tag, 否则他将会被绑定了 tag 的 job 所使用
  • executor 填 shell, 其他的不在本次实践范围

20210330163620

然后点击编辑,将 lock 那一项给点掉

20210330163658

最后返回列表你会看到

20210330161142

为了能运行nodejs项目,还需要继续安装 nodejs

apt update

# 安装解压工具
apt install xz-utils bzip2 -y

# 下载
wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz  

# 解压wget 
tar -xf node-v10.9.0-linux-x64.tar.xz

# 建立软连接,让npm和node可以在全局调用
ln -b -s /node-v10.9.0-linux-x64/bin/npm /bin/npm
ln -b -s /node-v10.9.0-linux-x64/bin/node /bin/node

# 查看node版本
node -v

安装一台用于部署的服务器

至此,我们还需要一台用于部署应用的服务器,我们使用 nginx 镜像

docker pull nginx
docker run -d --name nginx \
    -p 8080:80 \
    nginx:latest 

启动完毕后,8080端口就可以直接访问了 http://localhost:8080/

20210404014242

搭建代码仓库和cicd

新建一个仓库

至此,runner 的执行环境基本做完了,接下来我们需要新建一个代码仓库,然后配置 CI/CD 的相关内容。

我们需要先创建一个仓库

访问 gitlab http://localhost/, 在 project 里面找到 New Project

20210404014416

选择从一个模板中新建

20210330141010

找到 hexo 模板(一个静态化的博客系统)

20210330141031

新建

20210330141103

新建完毕后,可以在根目录下面找到 .gitlab-ci.yml 文件

测试CI/CD

模板默认已经配好了CICD,可以直接运行

配置cicd

找到 .gitlab-ci.yml 文件,点开编辑

image: node:10.15.3

cache:
  paths:
    - node_modules/

before_script:
  - test -e package.json && npm install

pages:
  script:
    # hexo构建命令用仓库自身的而不用全局命令
    - ./node_modules/hexo/bin/hexo generate
    # scp需要进行进行ssh相关的配置才可以使用,未完成
    # - scp -r public root@localhost:/usr/share/nginx/html
  artifacts:
    paths:
      - public
  only:
    - master

保存完毕后,CI/CD 就开始执行

20210331134531

发布程序

CI/CD 执行完毕后,由于我们配置了 artifacts 参数,可以在 CI/CD 面板中下载构建产物

20210331172338

我们可以直接在应用服务器上面下载这个产物 细节看此链接

# 访问ngx应用服务器
docker exec -it nginx bash
# 到ngx的目录
cd /usr/share/nginx/
# 下载最后一个在master上面构建的包
curl --output artifacts.zip --header "PRIVATE-TOKEN: s8Y9J1g5Azof89zfhEhN" "http://192.168.0.157/api/v4/projects/root%2Fblog/jobs/artifacts/master/download?job=pages" 

命令中的 Ip 请修改成自己的IP,不要使用localhost, root%2Fblog 是项目路径 root/blog encode之后的,PRIVATE-TOKEN 需要在仓库的 Setting -> access token 获得

20210331174424

下载完毕后可以使用 ls 查看

root@d77810f38ca5:/usr/share/nginx# ls
artifacts.zip  html

然后我们将其解压

# 更新软件源
apt update 

# 安装解压软件
apt install unzip 

unzip artifacts.zip

# 删除旧文件
rm -rf html 

# 将目录移到ngx配置目录
mv public html 

20210331180401

就可以看到结果了(样式问题是工程自己的问题)

使用 SCP 直接在 CI/CD 中发布

未完待续