diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..17b3334 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,80 @@ +name: mws-backend + +on: + push: + branches: + - main + +env: + DOCKERHUB_REPO: mws-backend + CONTAINER_NAME: mws-backend + HOST_PORT: "2000" + CONTAINER_PORT: "8080" + ASPNETCORE_ENVIRONMENT: Production + ENV_FILE: /home/deployer/apps/mws-backend/.env + +jobs: + build: + runs-on: ubuntu-latest + outputs: + sha_short: ${{ steps.vars.outputs.sha_short }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set short SHA + id: vars + run: echo "sha_short=$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT + + - name: Build Docker image + run: | + IMAGE_BASE="${{ secrets.REGISTRY_USER }}/${{ env.DOCKERHUB_REPO }}" + docker build \ + -t "$IMAGE_BASE:${{ steps.vars.outputs.sha_short }}" \ + -t "$IMAGE_BASE:latest" . + + push: + needs: build + runs-on: ubuntu-latest + steps: + - name: Login and push to Docker Hub + run: | + IMAGE_BASE="${{ secrets.REGISTRY_USER }}/${{ env.DOCKERHUB_REPO }}" + SHA="${{ needs.build.outputs.sha_short }}" + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u "${{ secrets.REGISTRY_USER }}" --password-stdin + docker push "$IMAGE_BASE:$SHA" + docker push "$IMAGE_BASE:latest" + docker logout + + deploy: + needs: [build, push] + runs-on: ubuntu-latest + steps: + - name: Pull and run new container + run: | + IMAGE_BASE="${{ secrets.REGISTRY_USER }}/${{ env.DOCKERHUB_REPO }}" + SHA="${{ needs.build.outputs.sha_short }}" + + if [ ! -f "${{ env.ENV_FILE }}" ]; then + echo "Thiếu ${{ env.ENV_FILE }} trên server" + exit 1 + fi + + echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u "${{ secrets.REGISTRY_USER }}" --password-stdin + docker pull "$IMAGE_BASE:$SHA" + docker logout + + docker stop "${{ env.CONTAINER_NAME }}" 2>/dev/null || true + docker rm "${{ env.CONTAINER_NAME }}" 2>/dev/null || true + + docker run -d \ + --name "${{ env.CONTAINER_NAME }}" \ + --restart unless-stopped \ + --env-file "${{ env.ENV_FILE }}" \ + -e ASPNETCORE_ENVIRONMENT="${{ env.ASPNETCORE_ENVIRONMENT }}" \ + -p "${{ env.HOST_PORT }}:${{ env.CONTAINER_PORT }}" \ + "$IMAGE_BASE:$SHA" + + docker images "$IMAGE_BASE" --format '{{.Repository}}:{{.Tag}}' \ + | grep -v -e ':latest$' -e ":$SHA$" \ + | xargs -r docker rmi || true \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 631a913..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,61 +0,0 @@ -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 images '$IMAGE_BASE' --format '{{.Repository}}:{{.Tag}}' | grep -v -e ':latest$' -e ':$CI_COMMIT_SHORT_SHA$' | xargs -r docker rmi || true" - - ssh -p "$DEPLOY_SSH_PORT" "$DEPLOYER_USER@$DEPLOYER_HOST" "docker logout"