使用 GitLab 实现持续集成
一 核心概念与工作机制
二 快速上手步骤
三 示例 .gitlab-ci.yml
# 示例:Node.js + 缓存 + 产物 + 部署到测试环境
stages:
- build
- test
- deploy
variables:
NODE_VERSION: "18"
PRODUCTION: "false"
build_job:
stage: build
image: node:$NODE_VERSION
script:
- npm ci
- npm run build --if-present
artifacts:
paths:
- dist/
expire_in: 1 week
cache:
paths:
- node_modules/
test_job:
stage: test
image: node:$NODE_VERSION
script:
- npm test -- --ci
dependencies:
- build_job
deploy_staging:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $STAGING_HOST >> ~/.ssh/known_hosts
script:
- rsync -avz --delete -e ssh dist/ $STAGING_USER@$STAGING_HOST:/var/www/myapp/
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == "main" && $PRODUCTION == "false"
deploy_prod:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $PROD_HOST >> ~/.ssh/known_hosts
script:
- rsync -avz --delete -e ssh dist/ $PROD_USER@$PROD_HOST:/var/www/myapp/
environment:
name: production
url: https://example.com
when: manual
only:
- main
四 运行与优化要点
五 常见问题排查