From 490007686e5807e16f73158997eb6a23bdefe989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=99=9A=20PH=E2=91=A6=20de=20Soria=E2=84=A2=E2=99=9B?= Date: Tue, 7 May 2024 19:03:06 +1000 Subject: [PATCH] Add DigitalOcean CD pipeline --- .github/workflows/build-and-deploy.yml | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/build-and-deploy.yml diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 0000000..e666e57 --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,70 @@ +name: CI + +# Step 1 +# Controls when the workflow will run +on: + # Triggers the workflow on push events but only for the master branch + push: + branches: [ master ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + version: + description: 'Image version' + required: true +# Step 2 +env: + REGISTRY: "your-digitalocean-registry-container-url" + IMAGE_NAME: "your-docker-image-name" + +# Step 3 +jobs: + build_and_push: + runs-on: ubuntu-latest + steps: + - name: Checkout the repo + uses: actions/checkout@v2 + + - name: Build container image + run: docker build -t $(echo $REGISTRY)/$(echo $IMAGE_NAME):$(echo $GITHUB_SHA | head -c7) . + + - name: Install doctl + uses: digitalocean/action-doctl@v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + + - name: Log in to DigitalOcean Container Registry with short-lived credentials + run: doctl registry login --expiry-seconds 600 + + - name: Remove all old images + run: if [ ! -z "$(doctl registry repository list | grep "$(echo $IMAGE_NAME)")" ]; then doctl registry repository delete-manifest $(echo $IMAGE_NAME) $(doctl registry repository list-tags $(echo $IMAGE_NAME) | grep -o "sha.*") --force; else echo "No repository"; fi + + - name: Push image to DigitalOcean Container Registry + run: docker push $(echo $REGISTRY)/$(echo $IMAGE_NAME):$(echo $GITHUB_SHA | head -c7) + + deploy: + runs-on: ubuntu-latest + needs: build_and_push + + steps: + - name: Deploy to Digital Ocean droplet via SSH action + uses: appleboy/ssh-action@v0.1.3 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSHKEY }} + passphrase: ${{ secrets.PASSPHRASE }} + envs: IMAGE_NAME,REGISTRY,{{ secrets.DIGITALOCEAN_ACCESS_TOKEN }},GITHUB_SHA + script: | + # Login to registry + docker login -u ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} -p ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} registry.digitalocean.com + # Stop running container + docker stop $(echo $IMAGE_NAME) + # Remove old container + docker rm $(echo $IMAGE_NAME) + # Run a new container from a new image + docker run -d \ + --restart always \ + --name $(echo $IMAGE_NAME) \ + $(echo $REGISTRY)/$(echo $IMAGE_NAME):$(echo $GITHUB_SHA | head -c7)