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 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 }}" echo "${{ secrets.ENV_FILE_CONTENT }}" > /tmp/app.env chmod 600 /tmp/app.env 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 /tmp/app.env \ -e ASPNETCORE_ENVIRONMENT="${{ env.ASPNETCORE_ENVIRONMENT }}" \ -p "${{ env.HOST_PORT }}:${{ env.CONTAINER_PORT }}" \ "$IMAGE_BASE:$SHA" rm -f /tmp/app.env docker images "$IMAGE_BASE" --format '{{.Repository}}:{{.Tag}}' \ | grep -v -e ':latest$' -e ":$SHA$" \ | xargs -r docker rmi || true