在 CentOS 上,用 GitLab 实现自动化运维的核心思路是以 GitLab CI/CD 为引擎,配合 GitLab Runner、流水线即代码与安全的凭据管理,把构建、测试、部署与回滚串联为一条可重复执行的自动化链路。
stages:
- build
- deploy_staging
- deploy_prod
variables:
APP_NAME: myapp
VERSION: $CI_COMMIT_SHORT_SHA
ARTIFACT: target/$APP_NAME-$VERSION.jar
build:
stage: build
tags: [build]
script:
- ./mvnw clean package -DskipTests
artifacts:
paths:
- $ARTIFACT
deploy_staging:
stage: deploy_staging
tags: [deploy]
script:
- scp $ARTIFACT $STAGING_USER@$STAGING_HOST:/opt/$APP_NAME/
- ssh $STAGING_USER@$STAGING_HOST "systemctl restart $APP_NAME || true"
only:
- main
deploy_prod:
stage: deploy_prod
tags: [deploy]
script:
- scp $ARTIFACT $PROD_USER@$PROD_HOST:/opt/$APP_NAME/
- ssh $PROD_USER@$PROD_HOST "systemctl restart $APP_NAME || true"
when: manual
only:
- main
stages:
- build
- deploy
variables:
IMAGE: $CI_REGISTRY/myorg/$CI_PROJECT_NAME
TAG: $CI_COMMIT_SHORT_SHA
build:
stage: build
image: docker:20.10
services:
- docker:20.10-dind
variables:
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE:$TAG .
- docker push $IMAGE:$TAG
only:
- main
deploy:
stage: deploy
image: alpine/ssh
script:
- ssh $DEPLOY_USER@$DEPLOY_HOST "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY"
- ssh $DEPLOY_USER@$DEPLOY_HOST "docker pull $IMAGE:$TAG"
- ssh $DEPLOY_USER@$DEPLOY_HOST "docker rm -f $APP_NAME || true"
- ssh $DEPLOY_USER@$DEPLOY_HOST "docker run -d --name $APP_NAME -p 8080:8080 $IMAGE:$TAG"
only:
- main