GitLab CI/CD

678 阅读2分钟

GitLab CI/CD 部署流程笔记

获取 URL 和 Token

  • 在 GitLab 项目的 Settings > CI / CD 页面,展开 Runners 设置部分,可以找到 URL 和 registration token(用于注册 GitLab Runner 的 token)。这些信息将用于 Runner 注册和配置;

安装并注册 GitLab Runner

  • 在想要部署的服务器[服务器、本机]上安装 GitLab Runner,可以通过 DockerShellKubernetes 等多种执行方式来运行 Runner;
  • 下通过Docker命令安装 GitLab Runner:
    bash
    docker run -d --name gitlab-runner --restart always \
      -v /srv/gitlab-runner/config:/etc/gitlab-runner \
      -v /var/run/docker.sock:/var/run/docker.sock \
      gitlab/gitlab-runner:latest
    
  • 注册 Runner命令连接gitlab项目
    bash
    gitlab-runner register
    
    • GitLab CI URL: 填入步骤 1 中获得的 GitLab 项目 URL(通常为 gitlab.com 或者你自建 GitLab 实例的 URL)。
    • Registration Token: 填入步骤 1 中的 token。
    • Runner 的执行方式: 选择适合的执行方式(如 dockershell 等)。如果使用 Docker,可以指定使用的镜像,例如 docker:latest
    • 标签(Tags) : 如果你在 .gitlab-ci.yml 中指定了标签,这里需要填写相应标签。标签用于让 GitLab 找到对应的 Runner 执行特定的 CI/CD 任务。
    • Runner 名称: 可自定义 Runner 名称,以便区分多个 Runner。
    • Executor(执行器) : 选择执行方式(如 dockershell)。如果选择 Docker,则需要设置相应的 Docker 镜像。

配置 .gitlab-ci.yml 文件

  • 配置文件(使用 Docker 执行器进行部署):
yaml
stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "Building the project..."
    - # 这里可以是构建项目的命令,例如 npm run build 或者 mvn package

deploy:
  stage: deploy
  script:
    - echo "Deploying the project..."
    - rsync -avz --delete ./path/to/project/ user@remote:/path/to/deployment/
  only:
    - main
  • stages: 定义流水线的不同阶段(如构建、测试、部署)。
  • build 阶段: 可以执行项目的构建命令(如编译、打包)。
  • deploy 阶段: 执行项目的部署命令,例如使用 rsync 将文件同步到远程服务器。
  • only: 限制流水线仅在特定分支(例如 main)上运行。

配置 GitLab Runner

  • 如果在 CI/CD 流程中使用 Docker,可能需要在 .gitlab-ci.yml 中指定 Docker 镜像。示例:
yaml
image: docker:latest

services:
  - docker:dind

before_script:
  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  • image: 指定 GitLab Runner 使用的基础 Docker 镜像。
  • services: 配置服务,例如 docker:dind(Docker in Docker),让 Runner 能够在容器内运行 Docker 命令。
  • before_script: 在主要命令之前执行的步骤,例如登录 Docker Registry。

自动化部署和优化

  • 环境变量: 可以在 GitLab CI/CD 设置中为项目或组级别配置 CI/CD 环境变量,避免在 .gitlab-ci.yml 中硬编码敏感信息(如服务器 IP、用户名、密码等)。
  • 缓存(Cache)与工件(Artifacts) : 使用缓存和工件可以加速构建和部署流程。例如,缓存依赖项或中间构建文件可以避免每次都重新下载或构建。
yaml
cache:
  paths:
    - node_modules/
artifacts:
  paths:
    - dist/

其他注意事项

  • 并发: GitLab Runner 可以在同一台机器上运行多个 Runner,甚至可以为不同的项目配置多个 Runner 以提高并行处理能力。
  • Runner 权限管理: 在 GitLab 中可以为 Runner 设置不同的权限范围,例如是否允许使用共享 Runner 或仅允许项目级别的 Runner。

链接及配置参考

#.gitlab-ci.yml
stages:
  - install
  - build
  - deploy

cache: # 在构建过程中需要缓存的文件夹,加快后续构建的速度,避免重复下载和构建依赖项
  paths:
    - node_modules
    - build
    
build-job:
  stage: build #任务属于build阶段
  only: #只会在分支以dev开头时执行
    - /^master.*/ 
  script: #执行列表
    - npm config set registry  https://registry.npmmirror.com #国内镜像源
    - npm config get registry #获取当前设置的npm包仓库地址
    - npm install 
    - npm run build2
    - ls dist/ #列出dist目录
    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"  #检查是否存在ssh-agent不存在则更新软件列表并安装openssh-client
    - eval $(ssh-agent -s) #启动ssh-agent并将其输出作为命令执行,以便后续使用SSH密钥
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null #将环境变量`SSH_PRIVATE_KEY`中的私钥添加到`ssh-agent`中,去除其中的回车符并将输出重定向到空设备。
    - mkdir -p ~/.ssh #创建`~/.ssh`目录,如果它不存在
    - chmod 700 ~/.ssh #设置`~/.ssh`目录的权限为 700(文件所有者拥有读写执行权限,其他用户没有权限)
    - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts # 将环境变量`SSH_KNOWN_HOSTS`中的内容写入`~/.ssh/known_hosts`文件
    - chmod 644 ~/.ssh/known_hosts #设置`~/.ssh/known_hosts`文件的权限为 644
    - ssh root@xx.xx.xxx.xx 'rm -rf /root/projects/pName/dist' # 通过 SSH 连接到 IP 地址为 47.98.112.39 的服务器,以 root 用户身份执行命令,删除服务器上指定目录下的`dist`目录
    - scp -r dist root@xx.xx.xxx.xx:/root/projects/pName #使用`scp`命令将本地的`dist`目录递归地复制到服务器上的指定目录
    - rm -rf dist/  #删除本地的`dist`目录
    - MY_IP=$(hostname -I | awk '{print $1}') #获取本地机器的 IP 地址,并将其存储在环境变量`MY_IP`中
    - echo $CI_COMMIT_AUTHOR #打印提交此代码的作者
    - curl -k -X POST -H "Content-Type:application/json" -d "{\"msg_type\":\"post\",\"content\":{\"post\":{\"zh_cn\":{\"title\":\"webname`echo ${CI_COMMIT_BRANCH/tool/}`版本已发布\",\"content\":[[{\"tag\":\"text\",\"text\":\"本次更新内容:`echo ${CI_COMMIT_MESSAGE}`\n\"},{\"tag\":\"a\",\"text\":\"查看\",\"href\":\weburl/\"}]]}}}}" webhookurl