Skip to content

test

test #4

Workflow file for this run

name: cd-postgres
on:
push:
branches:
- "main"
- "ops/4-db-deploy"
pull_request:
branches: ["main"]
workflow_dispatch:
env:
REGISTRY: ${{ vars.REGISTRY }}
ORG_NAME: ${{ vars.ORG_NAME }}
SERVICE_NAME: ${{ vars.SERVICE_NAME }}
IMAGE_NAME: ${{ vars.REGISTRY }}/${{ vars.ORG_NAME }}/${{ vars.SERVICE_NAME }}-ex
PORT: ${{ secrets.DB_PORT }}
TAG: ${{ vars.TAG }}
BUILD_CONTEXT: ${{ vars.BUILD_CONTEXT }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
outputs:
image: ${{ env.IMAGE_NAME }}:${{ env.TAG }}
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/metadata-action@v5
id: meta
with:
images: ${{ env.IMAGE_NAME }}
tags: |
type=raw,value=${{ env.TAG }}
type=sha,format=short
- uses: docker/build-push-action@v6
with:
context: ${{ env.BUILD_CONTEXT }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
smoke-test:
needs: build-and-push
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
steps:
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull image
run: docker pull ${{ env.IMAGE_NAME }}:${{ env.TAG }}
- name: Run container
run: |
docker run -d \
--name test-container \
-p ${{ env.PORT }}:5432 \
-e POSTGRES_USER=dummy \
-e POSTGRES_PASSWORD=dummy \
${{ env.IMAGE_NAME }}:${{ env.TAG }}
- name: Wait for health
run: |
for i in {1..20}; do
if docker exec test-container pg_isready -U dummy; then
echo "Postgres is ready"
exit 0
fi
sleep 2
done
echo "Smoke test failed"
docker logs test-container
exit 1
- name: Cleanup
if: always()
run: docker rm -f test-container || true
deploy:
needs: smoke-test
runs-on: ubuntu-latest
if: ${{ github.actor != 'nektos/act' }}
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
${{ env.BUILD_CONTEXT }}/docker-compose.yml
sparse-checkout-cone-mode: false
- name: Prepare compose
run: cp ${{ env.BUILD_CONTEXT }}/docker-compose.yml docker-compose.yml
- name: Upload docker-compose.yml
uses: appleboy/scp-action@v1
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USERNAME }}
key: ${{ secrets.REMOTE_SSH_KEY }}
source: docker-compose.yml
target: /opt/services/${{ env.SERVICE_NAME }}
- name: Deploy Image to GCP
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USERNAME }}
key: ${{ secrets.REMOTE_SSH_KEY }}
port: 22
debug: true
script: |
set -e
export DOCKER_CONFIG=$(mktemp -d)
trap 'rm -rf "$DOCKER_CONFIG"' EXIT
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ secrets.GHCR_USER }} --password-stdin
cd /opt/services/${{ env.SERVICE_NAME }} && ls
export IMAGE_NAME=${{ env.IMAGE_NAME }}:${{ env.TAG }}
export DB_PORT=${{ secrets.POSTGRES_PORT }}
export DB_USER=${{ secrets.DB_USER }}
export DB_PASSWORD=${{ secrets.DB_PASSWORD }}
export DB_NAME=${{ secrets.DB_NAME }}
docker compose pull
docker compose up -d