Gitlab CICD自动化打包部署实践总结

6,366 阅读4分钟

概念

Gitlab内置了CI/CD的工具,在项目中添加.gitlab-ci.yml文件,并且配置gitlab-runner(运行器)后,代码更新时会自动构建、部署。

.gitlab-ci.yml一般放在项目根目录,该文件是用来指定构建、测试和部署流程、以及CI触发条件的脚本。当Gitlab检测到代码提交符合.gitlab-ci.yml文件指定的触发条件时,则会使用配置的gitlab-runner执行.gitlab-ci.yml脚本。

gitlab-runner相当于Gitlab中任务的执行器,Gitlab会在需要执行任务时调用它。

配置gitlab CICD流程

配置gitlab CICD流程需要两步:

  • 第一步:在服务器安装 gitlab-runner 并关联仓库。
  • 第二步:编写gitlab-ci.yml。

安装 gitlab-runner

  1. 根据服务器系统版本,下载对应的gitlab-runner。使用uname -a 查看系统版本。
# Linux x86-64 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64" 
# Linux x86 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386" 
# Linux arm 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm"
# Linux arm64 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64" 
# Linux s390x 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-s390x" 
# Linux ppc64le 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-ppc64le" 
# Linux x86-64 FIPS Compliant 
sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64-fips"
  1. 给 gitlab-runner 分配执行权限
sudo chmod +x /usr/local/bin/gitlab-runner
  1. 创建gitlab ci用户
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
  1. 安装和运行gitlab-runner
sudo gitlab-runner install --user=root --working-directory=/home/gitlab-runner 
sudo gitlab-runner start
  • --working-directory:指定gitlab-runner运行的工作目录,会在该目录下安装依赖、打包代码、存储缓存。
  • --user:指定gitlab-runner运行的用户。
  1. 注册runner

    进入配置gitlab cicd的工程,选择Settings -> CI/CD -> Runners -> Expand,查看URL和token,执行下方命令注册runner,输入runner描述、runner tags、runner executor,在runners下面可以看到Available specific runners,表示注册成功。

sudo gitlab-runner register --url $URL --registration-token $REGISTRATION_TOKEN

image.png

image.png

gitlab-ci.yml

理解gitlab-ci.yml

gitlab-ci.yml 指定的任务内容总体构成1个pipeline、1个pipeline包含不同的stage执行阶段、每个stage包含不同的job任务。如下图所示:

image.png

编写gitlab-ci.yml

stages:
  - build
  - deploy
build_job:
  cache:
    untracked: true
    key:
      files:
        - package.json
    paths:
      - /node_modules/
  stage: build
  script:
    - npm install
    - npm run build
  tags:
    - ba-runner # 安装 gitlab-runner 时加的 tag
deploy_job:
  stage: deploy
  script:
    - echo '部署阶段'
  tags:
    - ba-runner # 安装 gitlab-runner 时加的 tag

踩坑记录

问题1:react 项目执行gitlab流水线打包时报错:Treating warnings as errors because process.env.CI = true.

image.png

解决: 在npm run build命令前加上 CI=false; react项目build.js中,process.env.CI是string类型,会导致判断条件始终为true。

image.png

问题2:安装依赖时,报权限EACCESS错误

image.png 在npm install中,添加--unsafe-perm=true --allow-root

npm install --unsafe-perm=true --allow-root

问题3: 让同一个stage下的job并行执行,提高部署效率。

打开/etc/gitlab-runner/config.toml,修改concurrent的值。其默认值为1,job之间是串行的。

问题4: 开启了缓存node_modules,但依然重新下载依赖。

在cache下加上untracked: true,untracked: true表示缓存被git忽略的文件。

cache:
    untracked: true
    key:
      files:
        - package.json
    paths:
      - /node_modules/

问题5:流水线报错fatal: git fetch-pack: expected shallow list fatal: The remote end hung up unexpectedly

image.png 系统自带的git版本是1.8,需要升级git版本www.baiyongj.com/news/493.ht…

问题6:deploy步骤的权限问题

cicd流水线中执行一些命令,而这些命令可能涉及的文件等并不是全部在 /home/gitlab-runner/目录下的,此时一般会提示没有权限执行等。有两种解决方法:

  1. 修改Gitlab-Runner的默认用户(gitlab-runner) 为root
  • 通过该命令sudo gitlab-runner uninstall可以卸载掉gitlab-runner默认用户。
  • 重新安装gitlab-runner并将用户设置为root gitlab-runner install --working-directory /home/gitlab-runner --user root (这里如果出现错误,不能重新安装,可能是/home/gitlab-runner目录不存在,需要先建立gitlab-runner目录)安装并设置--user(例如我想设置为root)
  • 启动、重启和停止
gitlab-runner start
gitlab-runner restart
gitlab-runner stop
  • 通过ps aux | grep gitlab-runner命令查看gitlab-runner进程。再次执行会发现--user的用户名已经更换成root了
  1. 编辑文件,/etc/sudoers 文件,然后在如下 root 的下一行增加如下一行
gitlab-runner ALL=(ALL) NOPASSWD:ALL

问题7: 将gerrit仓库中的代码,同步至gitlab仓库实现自动化打包。

说明: Gitlab用于自动化打包部署,Gerrit用于日常开发

image.png

本地仓库相关配置:

  • 第一步:在本地添加gitlab远程库,远程库命名为upstream
git remote add upstream git@gitlab.xxxxxxxxx.git
  • 第二步:查看远程库,已经添加成功。(origin默认为gerrit远程库)
git remote -v

image.png

  • 第三步:将origin库代码同步至upstream库
  1. 将origin远程分支(release_V4.7.4)同步至本地
git pull origin release_V4.7.4

2. 将release_V4.7.4分支代码推送至upstream库

git push --set-upstream upstream release_V4.7.4

3. 代码同步后,会自动触发gitlab cicd。

参考文献

docs.gitlab.com/runner/inst… blog.csdn.net/wtl1992/art… www.baiyongj.com/news/493.ht… blog.csdn.net/redrose2100… juejin.cn/post/689862… blog.csdn.net/joyce0323/a… blog.csdn.net/themagickey… www.cnblogs.com/hahaha11112…