前言

GitLab Runner是一个开源的项目,是用来执行GitLab中的项目的根目录下创建的.gitlab-ci.yml 脚本的工具。GitLab-CI可以比喻成管理工人的工厂,Runner是工厂里的工人,每个工人需要在工厂进行注册,所负责的项目不同,所做的工作也不同。当工厂某一个项目发生变动时,需要通知对应的工人去做对应的工作。

具体部署流程图

deploy.png

GitLab Runner简介

1. Runner类型

  • Shared Runner:所有工程都能够用的,且只有系统管理员能够创建
  • Specific Runner:只有特定的项目可以使用。

2. GitLab Runner中相关概念介绍

  • 管道(pipeline)
    每个推送到 Gitlab 的提交都会产生一个与该提交关联的管道(pipeline),若一次推送包含了多个提交,则管道与最后那个提交相关联,管道(pipeline)就是一个分成不同阶段(stage)的作业(job)的集合。

  • 阶段(Stage)
    阶段是对批量的作业的一个逻辑上的划分,每个 GitLab CI/CD 都必须包含至少一个 Stage。多个 Stage 是按照顺序执行的,如果其中任何一个 Stage 失败,则后续的 Stage 不会被执行,整个 CI 过程被认为失败
    image.png
    以图中所示为例,整个 CI 环节包含三个 Stage:build、test 和deploy。

  • build 被首先执行。如果发生错误,本次 CI 立刻失败;

  • test 在 build 成功执行完毕后执行。如果发生错误,本次 CI 立刻失败;

  • deploy 在 test 成功执行完毕后执行。如果发生错误,本次 CI 失败。

下图是Gitlab对阶段和阶段状态的展示:
stage.png
stage-status.png

  • 作业(Job)
    作业就是运行器(Runner)要执行的指令集合,Job 可以被关联到一个 Stage。当一个 Stage 执行的时候,与其关联的所有 Job 都会被执行。在有足够运行器的前提下,同一阶段的所有作业会并发执行。作业状态与阶段状态是一样的,实际上,阶段的状态就是继承自作业的。
    关于job中详细的参数介绍,请移步https://docs.gitlab.com/runner/

准备工作

  1. 准备gitlab 测试服务器,用于gitlab上的代码存储、CI等的配置
  2. 准备一台部署服务器,用于安装gitlab-ruuner并部署代码

开始Go!

1. 准备gitlab服务器,并创建一个项目

gitlab.png

2. 准备一台部署服务器,用于安装gitlab-ruuner并部署代码

1. 在部署服务器上安装gitlab-runner

# 安装gitlab-runner
yum install gitlab-runner

2. 向GitLab-CI注册gitlab-runner

  • 找到你的gitlab上存放的项目,找到settings–>CI/CD–>Runner
    runner-setting.png
    runner-setting2.png
  • 部署服务器上进行runner注册
gitlab-runner register

runner-register.png

  1. url:gitlab所在的测试服务器地址
  2. token:项目的token,用于关联runner和项目
  3. name:runner的名字,用于区分runner
  4. tags:用于匹配任务(jobs)和执行任务的设备(runners),此处不填直接回车时,默认Can run untagged jobs值为true
  5. executor:执行环境
  • 注册成功之后,我们就可以在gitlab的CI配置中看到刚才注册的runner了
    runner.png
  • 点开注册好的runner,可以看到具体配置内容
    runner-confige.png
    注意:如果你设置了Can run untagged jobs为No,那你需要在你gitlab-ci.yml文件中指定你要使用runner的tag,才能运行对应的runner,否则你任务可能一直在pending状态,找不到runner执行。

3. 启动gitlab-runner

  • 前台启动
gitlab-runner run
  • 后台启动(gitlab-runner service)
gitlab-runner install
gitlab-runner start

4. 配置ssh免登录,用于将gitlab-runner服务器上获取到的文件拷贝到服务器

  1. 首先登陆服务器,进入gitlab-runner用户下生成一对公钥,私钥对。生成过程需要两次输密码,直接回车即可。
ssh-keygen -t rsa -C  'your email@domain.com'
  1. 密钥默认保存位置在 ~/.ssh 目录下,打开后会看到私钥文件 id_rsa 和公钥文件 id_rsa.pub
    ssh.png
  2. 复制公钥到你的部署服务器上
scp ~/.ssh/id_rsa.pub <用户名>@<Linux的ip地址>:/root/.ssh/id_rsa.pub
  1. 把公钥追加到服务器ssh认证文件中
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

5.此后,从本地上传文件到服务器就不需要输用户名,密码了。
5. 在gitlab中配置变量,用于.gitlab-ci.yml文件
yum.png

  • 项目的根目录下编写.gitlab-ci.yml文件
##缓存 node_modules/目录 下次构建不会删除
cache:
  paths:
  - node_modules/
stages: # Stages 表示构建阶段,这里有两个阶段 install, deploy
  - build
  - deploy

fetch: # Jobs 表示构建工作,表示某个 Stage 里面执行的工作。
  stage: build
  script:
    - echo "=====start build======"
    - npm i 
    - npm run build
    - echo "=====end build======"
  only:
    - master
  artifacts: 
    expire_in: 2 week
    paths: 
      - dist/
    
deploy-static:
  stage: deploy
  script:
    - echo "=====start deploy======"
    - scp -r ./dist root@$DEPLOY_SERVER_DEV:$WEB_DIR
    - echo "=====end deploy======"

6. 把.gitlab-ci.yml文件推送到gitlab仓储,触发流水线
pipeline.png

  • 点击每次构建状态,可以查看构建详情,如果有错误的话可以点开构建阶段,查看错误详情。
    deploy-error.png

deploy-pass.png
7. 到此,我们已经完成了一套完整对自动化部署,之后只有gitlab仓库有代码更新,就可以触发流水线了

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐