在开始前,需确保已具备以下环境:
GitLab Runner是执行CI/CD任务的代理,需先安装并注册到GitLab实例。
以Ubuntu为例,通过包管理器安装:
# 更新包列表
sudo apt-get update
# 安装依赖项
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
# 添加GitLab Runner官方GPG密钥和软件源
curl -L --output /etc/apt/trusted.gpg.d/gitlab.asc https://packages.gitlab.com/install/repositories/gitlab/gitlab-runner/script.deb.sh | sudo bash
echo "deb https://packages.gitlab.com/gitlab/gitlab-runner/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gitlab-runner.list
# 安装GitLab Runner
sudo apt-get update
sudo apt-get install gitlab-runner -y
运行注册命令,按提示输入GitLab实例URL和注册Token(可在GitLab项目→Settings→CI/CD→Runners中获取):
sudo gitlab-runner register
--executor:选择执行器(推荐shell(简单任务)或docker(隔离环境));--tag-list:设置Runner标签(如ci,deploy),用于匹配项目中的tags规则;--run-untagged:是否运行未打标签的Job(默认false)。注册完成后,启动Runner服务:
sudo systemctl start gitlab-runner
sudo systemctl enable gitlab-runner
在项目根目录下创建.gitlab-ci.yml文件,定义CI/CD流程的核心逻辑(YAML格式)。以下是一个基础示例:
# 定义CI/CD阶段(按顺序执行)
stages:
- build # 构建阶段
- test # 测试阶段
- deploy # 部署阶段
# 构建任务(属于build阶段)
build_job:
stage: build
script:
- echo "Building the project..."
- mkdir -p build
- cd build && cmake .. && make # 示例:C++项目构建
artifacts: # 传递构建产物到后续Job
paths:
- build/
expire_in: 1 hour # 产物有效期
# 测试任务(属于test阶段,依赖build_job的产物)
test_job:
stage: test
script:
- echo "Running tests..."
- cd build && ctest # 示例:C++项目测试
rules:
- when: always # 无论build是否成功都运行(可根据需求调整)
# 部署任务(属于deploy阶段,仅master分支触发)
deploy_job:
stage: deploy
script:
- echo "Deploying to production server..."
- scp -r build/* user@remote-server:/var/www/html/ # 示例:SCP部署
only:
- master # 仅master分支触发部署
tags:
- deploy # 匹配Runner的tag-list
关键概念说明:
build_job),包含script(执行命令)、artifacts(传递产物)、rules(触发条件)等;tag-list,确保任务由指定Runner执行。敏感信息(如服务器密码、Docker凭证)不应硬编码在.gitlab-ci.yml中,需通过GitLab的CI/CD变量管理:
DEPLOY_SERVER、DOCKER_PASSWORD);在.gitlab-ci.yml中通过$变量名引用(如ssh user@$DEPLOY_SERVER)。
将.gitlab-ci.yml文件提交到GitLab仓库的目标分支(如master),GitLab Runner会自动检测并触发流水线:
git add .gitlab-ci.yml
git commit -m "Add GitLab CI/CD configuration"
git push origin master
查看流程状态:
根据项目需求,可优化CI/CD流程:
通过cache指令缓存依赖目录(如node_modules、~/.m2),减少重复下载:
build_job:
stage: build
script:
- echo "Installing dependencies..."
- npm install # 示例:Node.js项目
cache:
paths:
- node_modules/ # 缓存目录
policy: pull-push # 拉取缓存→执行任务→推送缓存
通过parallel指令并行运行多个Job(如同时运行单元测试和集成测试):
test_unit:
stage: test
script:
- echo "Running unit tests..."
parallel: 2 # 并行运行2个实例
test_integration:
stage: test
script:
- echo "Running integration tests..."
parallel: 2
docker镜像和docker:dind(Docker-in-Docker)构建镜像并推送到Registry;kubectl命令或Helm Charts将镜像部署到K8s集群(需配置KUBECONFIG变量)。示例(Docker构建与推送):
build_image:
stage: build
image: docker:latest
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_TLS_CERTDIR: "" # 禁用TLS(仅测试环境)
services:
- docker:dind # 启动Docker-in-Docker服务
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
.gitlab-ci.yml文件是否在项目根目录;通过以上步骤,即可在Linux环境下搭建GitLab CI/CD流程,实现代码的自动化构建、测试和部署。根据项目需求,可进一步扩展和优化流程(如添加代码质量检查、通知机制等)。