在 Linux 上集成 GitLab CI/CD 的完整实践
一 架构与准备
二 安装与注册 GitLab Runner
curl -L --output /etc/apt/trusted.gpg.d/gitlab.asc https://packages.gitlab.com/install/repositories/runner/gitlab-runner/gpgkey
echo "deb https://packages.gitlab.com/runner/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 -y gitlab-runner
sudo systemctl enable --now gitlab-runner
sudo gitlab-runner register
# 依次输入:GitLab 实例地址(如 https://gitlab.com 或自托管地址)
# 注册令牌(项目/群组 Settings > CI/CD > Runners 获取)
# 描述、标签(如 ci,deploy)
# 执行器(shell 或 docker)
# 如选 docker:默认镜像(如 alpine:latest)
sudo gitlab-runner register \
--url https://gitlab.com/ \
--registration-token YOUR_TOKEN \
--executor shell \
--description "linux-shell-runner" \
--tag-list "ci,deploy" \
--run-untagged=false \
--locked=false
三 编写 .gitlab-ci.yml 与触发流水线
stages:
- build
- test
- deploy
variables:
NODE_VERSION: "18"
cache:
paths:
- node_modules/
key: ${CI_COMMIT_REF_SLUG} # 按分支缓存依赖
build_job:
stage: build
image: node:${NODE_VERSION}
script:
- npm ci
- npm run build --if-present
artifacts:
paths:
- dist/
expire_in: 1 hour
test_job:
stage: test
image: node:${NODE_VERSION}
script:
- npm test -- --ci
deploy_job:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
script:
- rsync -avz --delete dist/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH
only:
- main
四 安全与网络配置要点
五 进阶与常见问题
build_image:
stage: build
image: docker:24.0
services:
- docker:24.0-dind
variables:
DOCKER_HOST: tcp://docker:2375
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG