Skip to content

Docker Image CI

Docker Image CI #264

Workflow file for this run

name: Docker Image CI
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
push:
branches: [ "master" ]
paths-ignore:
- '**/README.md'
- 'Ubuntu/**'
- '.github/**'
- '.gitattributes'
- '.gitignore'
jobs:
fetch-latest-tags:
runs-on: ubuntu-latest
outputs:
PGAGENT_TAG: ${{ env.PGAGENT_TAG }}
SYS_STATS_TAG: ${{ env.SYS_STATS_TAG }}
ZILEAN_TAG: ${{ env.ZILEAN_TAG }}
RIVEN_TAG: ${{ env.RIVEN_TAG }}
RIVEN_FRONTEND_TAG: ${{ env.RIVEN_FRONTEND_TAG }}
steps:
- name: Fetch latest pgAgent release tag
run: |
PGAGENT_TAG=$(curl -s https://api.github.com/repos/pgadmin-org/pgagent/releases/latest | jq -r .tag_name)
echo "PGAGENT_TAG=$PGAGENT_TAG" >> $GITHUB_ENV
- name: Fetch latest system_stats release tag
run: |
SYS_STATS_TAG=$(curl -s https://api.github.com/repos/EnterpriseDB/system_stats/releases/latest | jq -r .tag_name)
echo "SYS_STATS_TAG=$SYS_STATS_TAG" >> $GITHUB_ENV
- name: Fetch latest zilean release tag
run: |
ZILEAN_TAG=$(curl -s https://api.github.com/repos/iPromKnight/zilean/releases/latest | jq -r .tag_name)
echo "ZILEAN_TAG=$ZILEAN_TAG" >> $GITHUB_ENV
- name: Fetch latest riven release tag
run: |
RIVEN_TAG=$(curl -s https://api.github.com/repos/rivenmedia/riven/releases/latest | jq -r .tag_name)
echo "RIVEN_TAG=$RIVEN_TAG" >> $GITHUB_ENV
- name: Fetch latest riven-frontend release tag
run: |
RIVEN_FRONTEND_TAG=$(curl -s https://api.github.com/repos/rivenmedia/riven-frontend/releases/latest | jq -r .tag_name)
echo "RIVEN_FRONTEND_TAG=$RIVEN_FRONTEND_TAG" >> $GITHUB_ENV
build-and-push:
needs: fetch-latest-tags
runs-on: self-hosted
outputs:
version: ${{ env.VERSION }}
repo_owner_lower: ${{ env.REPO_OWNER_LOWER }}
repo_name: ${{ env.REPO_NAME }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'all'
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Clean up unused Docker images and containers
run: docker system prune --all --force --volumes
- name: Pre-Build Disk Space
run: |
echo "Disk space before build:"
df -h
- name: Cache Docker layers
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Extract version and set environment variables
id: setup_env_vars
run: |
VERSION=$(grep -Po '(?<=version = ")[^"]+' main.py)
REPO_OWNER_LOWER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
REPO_NAME=$(basename "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "REPO_OWNER_LOWER=$REPO_OWNER_LOWER" >> $GITHUB_ENV
echo "REPO_NAME=$REPO_NAME" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_ENV
echo "repo_owner_lower=$REPO_OWNER_LOWER" >> $GITHUB_ENV
echo "repo_name=$REPO_NAME" >> $GITHUB_ENV
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Docker image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: linux/amd64, linux/arm64 #, linux/arm/v7
cache-from: type=gha,scope=build
cache-to: type=gha,scope=build,mode=max
tags: |
${{ secrets.DOCKER_USERNAME }}/${{ env.REPO_NAME }}:${{ env.VERSION }}
${{ secrets.DOCKER_USERNAME }}/${{ env.REPO_NAME }}:latest
ghcr.io/${{ env.REPO_OWNER_LOWER }}/${{ env.REPO_NAME }}:${{ env.VERSION }}
ghcr.io/${{ env.REPO_OWNER_LOWER }}/${{ env.REPO_NAME }}:latest
build-args: |
PGAGENT_TAG=${{ needs.fetch-latest-tags.outputs.PGAGENT_TAG }}
SYS_STATS_TAG=${{ needs.fetch-latest-tags.outputs.SYS_STATS_TAG }}
ZILEAN_TAG=${{ needs.fetch-latest-tags.outputs.ZILEAN_TAG }}
RIVEN_TAG=${{ needs.fetch-latest-tags.outputs.RIVEN_TAG }}
RIVEN_FRONTEND_TAG=${{ needs.fetch-latest-tags.outputs.RIVEN_FRONTEND_TAG }}
push: true
release:
needs: build-and-push
runs-on: ubuntu-latest
outputs:
release_exists: ${{ steps.check_release.outputs.release_exists }}
env:
VERSION: ${{ needs.build-and-push.outputs.version }}
REPO_OWNER_LOWER: ${{ needs.build-and-push.outputs.repo_owner_lower }}
REPO_NAME: ${{ needs.build-and-push.outputs.repo_name }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Check if Release Exists
id: check_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ env.VERSION }}
run: |
if gh release view "${{ env.VERSION }}" --repo ${{ github.repository }}; then
echo "Release already exists for version ${{ needs.build-and-push.outputs.version }}"
echo "release_exists=true" >> $GITHUB_ENV
echo "release_exists=true" >> $GITHUB_OUTPUT
else
echo "Release does not exist for version ${{ needs.build-and-push.outputs.version }}"
echo "release_exists=false" >> $GITHUB_ENV
echo "release_exists=false" >> $GITHUB_OUTPUT
fi
- name: Create Release with CHANGELOG Notes
if: env.release_exists == 'false'
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
RELEASE_NOTES=$(awk '/^## Version \[${{ env.VERSION }}\]/ {flag=1; next} /^## Version \[/ {flag=0} flag' CHANGELOG.md)
gh release create ${{ env.VERSION }} \
--repo ${{ github.repository }} \
--title "Release ${{ env.VERSION }}" \
--notes "$RELEASE_NOTES" \
--draft=false \
--prerelease=false
announce:
needs: [release, build-and-push]
if: needs.release.outputs.release_exists == 'false'
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Post announcement to Discord
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
VERSION: ${{ needs.build-and-push.outputs.version }}
run: |
RELEASE_NOTES=$(awk '/^## Version \[${{ env.VERSION }}\]/ {flag=1; next} /^## Version \[/ {flag=0} flag' CHANGELOG.md)
ANNOUNCEMENT_BODY="🚀 **New Release: Version [${{ env.VERSION }}]**${RELEASE_NOTES}"
ESCAPED_BODY=$(echo "$ANNOUNCEMENT_BODY" | jq -Rsa .)
curl -H "Content-Type: application/json" \
-d "{\"content\": $ESCAPED_BODY, \"flags\": 4}" \
$DISCORD_WEBHOOK_URL