在开始配置前,需确保以下前提条件满足:
GitLab Runner是执行CI/CD任务的代理,需先安装并注册到GitLab实例。
以Ubuntu/Debian为例,通过包管理器安装:
# 添加GitLab Runner官方GPG密钥和源
curl -L --output /etc/apt/trusted.gpg.d/gitlab.asc https://packages.gitlab.com/gitlab/gitlab-runner/gpgkey
echo "deb https://packages.gitlab.com/gitlab/gitlab-runner/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gitlab-runner.list
# 更新包列表并安装
sudo apt-get update
sudo apt-get install gitlab-runner -y
以CentOS/RHEL为例,使用Yum安装:
# 添加GitLab Runner Yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
# 安装GitLab Runner
sudo yum install gitlab-ci-multi-runner -y
执行注册命令,按提示输入GitLab实例URL和注册Token(可在项目→Settings→CI/CD→Runners中获取):
sudo gitlab-runner register
--url:GitLab实例地址(如https://gitlab.com或自建实例地址);--token:项目注册Token(仅首次注册项目时有效);--executor:执行器类型(推荐shell(本地执行)、docker(容器化执行)或kubernetes(K8s集群执行));--description:Runner描述(如My Linux Runner);--tag-list:Runner标签(如ci,deploy,用于匹配流水线中的tags要求)。# 设置开机自启并立即启动
sudo systemctl enable gitlab-runner
sudo systemctl start gitlab-runner
验证Runner状态:
sudo gitlab-runner status
.gitlab-ci.yml是CI/CD流程的核心配置文件,需放置在项目根目录下,定义阶段(Stages)、**任务(Jobs)**及执行逻辑。
以下是一个涵盖构建→测试→部署的基础流程示例(适用于Java项目):
# 定义流水线阶段(按顺序执行)
stages:
- build
- test
- deploy
# 构建任务
build_job:
stage: build
script:
- echo "Building the project..."
- ./gradlew build # 或mvn clean package(Maven项目)
artifacts:
paths:
- build/libs/*.jar # 保存构建产物(供后续任务使用)
expire_in: 1 hour # 产物过期时间(可选)
# 测试任务(仅在构建成功后执行)
test_job:
stage: test
script:
- echo "Running unit tests..."
- ./gradlew test # 或mvn test
rules:
- when: always # 无论构建是否成功都执行(可根据需求调整)
# 部署任务(仅当代码推送到master分支时执行)
deploy_job:
stage: deploy
script:
- echo "Deploying to production server..."
- scp build/libs/*.jar user@production-server:/opt/app/
- ssh user@production-server "systemctl restart my-app.service"
only:
- master # 仅master分支触发
tags:
- deploy # 仅匹配带deploy标签的Runner
build→test→deploy),任务按阶段依次执行;when: always表示始终执行,when: on_success表示仅在成功时执行);only: - master表示仅master分支触发);tags: - docker表示仅由带docker标签的Runner执行)。敏感信息(如服务器密码、Docker Registry凭证)不应直接写在.gitlab-ci.yml中,需通过CI/CD变量管理。
操作步骤:
DEPLOY_SERVER_PASSWORD)和Value(如服务器密码);.gitlab-ci.yml中通过$KEY引用变量:deploy_job:
script:
- sshpass -p "$DEPLOY_SERVER_PASSWORD" scp build/libs/*.jar user@production-server:/opt/app/
流水线触发方式有两种:
git push origin master)或创建合并请求时,自动启动流水线;build_job),可查看详细的执行日志(包括命令输出和错误信息);cache指令缓存依赖或中间文件,加速构建(如缓存node_modules或.m2仓库):build_job:
cache:
paths:
- .gradle/caches/ # Gradle缓存目录
key: ${CI_COMMIT_REF_SLUG} # 按分支生成缓存键
docker Executor构建和推送镜像(需配置Docker Registry认证):image: docker:latest
services:
- docker:dind # 启用Docker-in-Docker
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: "" # 禁用TLS(仅测试环境使用)
build_image:
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
kubectl命令将应用部署到K8s集群(需配置Kubeconfig):deploy_to_k8s:
stage: deploy
script:
- kubectl config set-cluster k8s-cluster --server="$KUBE_SERVER"
- kubectl config set-credentials k8s-user --token="$KUBE_TOKEN"
- kubectl config set-context k8s-context --cluster=k8s-cluster --user=k8s-user
- kubectl config use-context k8s-context
- kubectl set image deployment/my-app my-app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- master
通过以上步骤,即可在Linux环境下完成GitLab CI/CD流程的设置,实现代码的自动化构建、测试和部署。根据项目需求,可进一步扩展流程(如添加代码质量检查、自动化通知等)。