stages: - build - push - deploy variables: DOCKERHUB_REPO: "mws-backend" CONTAINER_NAME: "mws-backend" HOST_PORT: "2000" CONTAINER_PORT: "8080" DEPLOY_SSH_PORT: "8686" ASPNETCORE_ENVIRONMENT: "Production" default: tags: - deploy - build workflow: rules: - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "master"' - when: never build: stage: build script: - IMAGE_BASE="$REGISTRY_USER/$DOCKERHUB_REPO" - docker build -t "$IMAGE_BASE:$CI_COMMIT_SHORT_SHA" -t "$IMAGE_BASE:latest" . push: stage: push script: - IMAGE_BASE="$REGISTRY_USER/$DOCKERHUB_REPO" - echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USER" --password-stdin - docker push "$IMAGE_BASE:$CI_COMMIT_SHORT_SHA" - docker push "$IMAGE_BASE:latest" - docker logout deploy: stage: deploy environment: name: production before_script: - command -v ssh-agent >/dev/null 2>&1 || (apt-get update -y && apt-get install -y openssh-client) - eval "$(ssh-agent -s)" - chmod 600 "$SSH_PRIVATE_KEY" - ssh-add "$SSH_PRIVATE_KEY" - mkdir -p ~/.ssh && chmod 700 ~/.ssh - ssh-keyscan -p "$DEPLOY_SSH_PORT" -H "$DEPLOYER_HOST" >> ~/.ssh/known_hosts 2>/dev/null - chmod 644 ~/.ssh/known_hosts script: - IMAGE_BASE="$REGISTRY_USER/$DOCKERHUB_REPO" - ENV_FILE="/home/$DEPLOYER_USER/apps/$CI_PROJECT_NAME/.env" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "echo '$REGISTRY_PASSWORD' | docker login -u '$REGISTRY_USER' --password-stdin" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker pull '$IMAGE_BASE:$CI_COMMIT_SHORT_SHA'" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker stop '$CONTAINER_NAME' 2>/dev/null || true" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker rm '$CONTAINER_NAME' 2>/dev/null || true" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "test -f '$ENV_FILE' || { echo \"Thiếu $ENV_FILE trên server\"; exit 1; }" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker run -d --name '$CONTAINER_NAME' --restart unless-stopped --env-file '$ENV_FILE' -e ASPNETCORE_ENVIRONMENT='$ASPNETCORE_ENVIRONMENT' -p '$HOST_PORT:$CONTAINER_PORT' '$IMAGE_BASE:$CI_COMMIT_SHORT_SHA'" - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker logout"