Thanks to visit codestin.com
Credit goes to github.com

Skip to content

CI/CD for PostgreSQL Docker - Build, Push, and Deploy #2

CI/CD for PostgreSQL Docker - Build, Push, and Deploy

CI/CD for PostgreSQL Docker - Build, Push, and Deploy #2

Workflow file for this run

name: CI/CD for PostgreSQL Docker
on:
workflow_dispatch:
inputs:
environment:
description: 'Environment to deploy (Development/Production)'
required: true
default: 'development'
postgres_version:
description: 'Postgres Version'
required: true
default: '17'
jobs:
build-and-push:
name: Build and Push Docker Images for PostgreSQL
runs-on: ubuntu-latest
steps:
# Checkout Postgres Docker repository into a specific directory
- name: Checkout Postgres Repository
uses: actions/checkout@v3
with:
repository: trplgit/postgres
token: ${{ secrets.GITHUB_TOKEN }}
path: postgres # Checkout into the 'postgres' directory
# Set up Docker buildx
- name: Set up Docker
uses: docker/setup-buildx-action@v2
with:
version: latest
# Log in to Azure Container Registry
- name: Log in to Azure Container Registry
uses: azure/docker-login@v1
with:
login-server: ${{ vars.ACR_NAME }}.azurecr.io
username: ${{ vars.ACR_USERNAME }}
password: ${{ secrets.ACR_PASSWORD }}
# Build and Push Postgres Docker Image for PostgreSQL 17
- name: Build and Push Postgres Docker Image
run: |
docker build -f ./postgres/17/alpine3.21/Dockerfile -t ${{ vars.ACR_NAME }}.azurecr.io/${{ inputs.environment }}/trpl-postgres-docker:v17 ./postgres/17/alpine3.21
docker push ${{ vars.ACR_NAME }}.azurecr.io/${{ inputs.environment }}/trpl-postgres-docker:v17
deploy:
name: Deploy PostgreSQL to Linux VM
runs-on: ubuntu-latest
needs: build-and-push
steps:
# Install OpenVPN
- name: Install OpenVPN
run: sudo apt-get install -y openvpn
# Prepare VPN files
- name: Prepare VPN Files
run: |
echo "${{ secrets.VPN_PKCS12_FILE }}" | base64 -d > TRPL-FW-TCP-1194-ci-cd-automation.p12
echo "${{ secrets.VPN_TLS_KEY_FILE }}" | base64 -d > TRPL-FW-TCP-1194-ci-cd-automation-tls.key
# Connect to VPN
- name: Connect to VPN
run: |
echo "${{ secrets.VPN_CONFIG_FILE }}" > vpn-config.ovpn
echo -e "${{ vars.VPN_USERNAME }}\n${{ secrets.VPN_PASSWORD }}" > vpn-credentials.txt
sudo openvpn --config vpn-config.ovpn --auth-user-pass vpn-credentials.txt --daemon
# Wait for VPN connection
- name: Wait for VPN Connection
run: sleep 15
# Verify VPN connection
- name: Verify VPN Connection
run: |
ifconfig | grep tun || (echo "VPN connection failed" && exit 1)
# Add user to Docker group to allow Docker commands without sudo
- name: Add user to Docker group
run: |
sudo usermod -aG docker $USER
newgrp docker || true
# Create Docker network if not exists
- name: Create Docker Network if not exists
run: |
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker network create odoo-postgres-network || echo "Network already exists"
# Deploy Postgres Docker container to VM
- name: Deploy Postgres Docker Container to VM
uses: appleboy/[email protected]
with:
host: ${{ vars.LINUX_VM_HOST_DEVELOPMENT }}
username: ${{ vars.LINUX_VM_USERNAME_DEVELOPMENT }}
password: ${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}
port: 22
script: |
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker login ${{ vars.ACR_NAME }}.azurecr.io -u ${{ vars.ACR_USERNAME }} -p ${{ secrets.ACR_PASSWORD }}
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker pull ${{ vars.ACR_NAME }}.azurecr.io/${{ inputs.environment }}/trpl-postgres-docker:v17
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker stop postgres-container || true
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker rm postgres-container || true
# Run Postgres container (PostgreSQL 17)
echo "${{ secrets.LINUX_VM_PASSWORD_DEVELOPMENT }}" | sudo -S docker run -d --restart always --name postgres-container --network=odoo-postgres-network -e POSTGRES_PASSWORD=mysecretpassword -p 5433:5433 ${{ vars.ACR_NAME }}.azurecr.io/${{ inputs.environment }}/trpl-postgres-docker:v17
# Cleanup VPN credentials
- name: Cleanup VPN Credentials
run: |
rm -f vpn-config.ovpn vpn-credentials.txt