Skip to content

v9.7.0

v9.7.0 #40

name: Build Pyatlan Chainguard Base Image
on:
workflow_dispatch:
inputs:
build_type:
description: 'Build type (dev uses amd64 only, release uses amd64+arm64)'
required: true
default: 'dev'
type: choice
options:
- 'dev'
- 'release'
python_version:
description: 'Python version (leave empty for 3.13)'
required: false
type: choice
options:
- ''
- '3.9'
- '3.10'
- '3.11'
- '3.12'
- '3.13'
pyatlan_version:
description: 'Pyatlan version (leave empty to use version.txt ie: latest)'
required: false
type: string
pyatlan_branch:
description: 'Pyatlan git branch (overrides version - installs from git://github.com/atlanhq/atlan-python.git@branch)'
required: false
type: string
release:
types: [published]
permissions:
contents: read
packages: write
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Need full history for commit hash
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Log in to Atlan Harbor Registry
uses: docker/login-action@v4
with:
registry: registry.atlan.com
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Log in to Chainguard Container Registry
uses: docker/login-action@v4
with:
registry: cgr.dev
username: ${{ secrets.CHAINGUARD_USERNAME }}
password: ${{ secrets.CHAINGUARD_PASSWORD }}
- name: Set build parameters
id: set-params
run: |
# Check if triggered by release or manual dispatch
if [ "${{ github.event_name }}" = "release" ]; then
# Release trigger: use latest Python and SDK version, release build type
BUILD_TYPE="release"
PYTHON_VERSION="3.13"
PYATLAN_VERSION=$(cat pyatlan/version.txt)
echo "Release trigger detected - building from git tag v${PYATLAN_VERSION}"
else
# Manual dispatch: use provided inputs with defaults
BUILD_TYPE="${{ github.event.inputs.build_type }}"
# Set Python version (default to 3.13 if empty)
if [ -z "${{ github.event.inputs.python_version }}" ]; then
PYTHON_VERSION="3.13"
else
PYTHON_VERSION="${{ github.event.inputs.python_version }}"
fi
# Set Pyatlan version (reads from pyatlan/version.txt by default)
# This matches the version in the repository
if [ -z "${{ github.event.inputs.pyatlan_version }}" ]; then
PYATLAN_VERSION=$(cat pyatlan/version.txt)
echo "Using pyatlan version from version.txt: $PYATLAN_VERSION"
else
PYATLAN_VERSION="${{ github.event.inputs.pyatlan_version }}"
echo "Using specified pyatlan version: $PYATLAN_VERSION"
fi
# Handle branch input (if provided, will be used as commit SHA or branch name)
if [ -n "${{ github.event.inputs.pyatlan_branch }}" ]; then
echo "Note: Building from branch/commit: ${{ github.event.inputs.pyatlan_branch }}"
echo "This will use PYATLAN_COMMIT_SHA build arg"
fi
fi
echo "BUILD_TYPE=$BUILD_TYPE" >> $GITHUB_ENV
echo "PYTHON_VERSION=$PYTHON_VERSION" >> $GITHUB_ENV
echo "PYATLAN_VERSION=$PYATLAN_VERSION" >> $GITHUB_ENV
# Set platforms based on build type
if [ "$BUILD_TYPE" = "dev" ]; then
PLATFORMS="linux/amd64"
else
PLATFORMS="linux/amd64,linux/arm64"
fi
echo "PLATFORMS=$PLATFORMS" >> $GITHUB_ENV
# Generate commit hash for dev builds (for image tagging only)
COMMIT_HASH=$(git rev-parse --short HEAD)
echo "COMMIT_HASH=$COMMIT_HASH" >> $GITHUB_ENV
# Set PYATLAN_COMMIT_SHA only if pyatlan_branch input is provided
# Otherwise, leave empty to let Dockerfile use version tag
if [ -n "${{ github.event.inputs.pyatlan_branch }}" ]; then
echo "PYATLAN_COMMIT_SHA=${{ github.event.inputs.pyatlan_branch }}" >> $GITHUB_ENV
else
echo "PYATLAN_COMMIT_SHA=" >> $GITHUB_ENV
fi
echo "Build parameters:"
echo " - Trigger: ${{ github.event_name }}"
echo " - Build Type: $BUILD_TYPE"
echo " - Python Version: $PYTHON_VERSION"
if [ -n "${{ github.event.inputs.pyatlan_branch }}" ]; then
echo " - Pyatlan Source: git commit/branch ${{ github.event.inputs.pyatlan_branch }}"
else
echo " - Pyatlan Source: git tag v${PYATLAN_VERSION}"
fi
echo " - Build Method: Multi-stage build from GitHub source"
echo " - Platforms: $PLATFORMS"
echo " - Image Tag Suffix: $COMMIT_HASH"
- name: Generate image tags
id: generate-tags
run: |
BUILD_TYPE="${{ env.BUILD_TYPE }}"
PYTHON_VERSION="${{ env.PYTHON_VERSION }}"
PYATLAN_VERSION="${{ env.PYATLAN_VERSION }}"
COMMIT_HASH="${{ env.COMMIT_HASH }}"
if [ "$BUILD_TYPE" = "dev" ]; then
# Dev: 8.0.0-3.11-commithash
IMAGE_TAG="${PYATLAN_VERSION}-${PYTHON_VERSION}-${COMMIT_HASH}"
HARBOR_TAGS="registry.atlan.com/public/pyatlan:${IMAGE_TAG}\nregistry.atlan.com/public/pyatlan:sha-${COMMIT_HASH}"
else
# Release: 8.0.0-3.11
IMAGE_TAG="${PYATLAN_VERSION}-${PYTHON_VERSION}"
HARBOR_TAGS="registry.atlan.com/public/pyatlan:${IMAGE_TAG}\nregistry.atlan.com/public/pyatlan:main-latest\nregistry.atlan.com/public/pyatlan:main-${PYATLAN_VERSION}\nregistry.atlan.com/public/pyatlan:sha-${COMMIT_HASH}"
fi
echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV
echo "HARBOR_TAGS<<EOF" >> $GITHUB_ENV
echo -e "$HARBOR_TAGS" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "Generated image tag: ghcr.io/atlanhq/pyatlan-chainguard-base:$IMAGE_TAG"
- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
platforms: ${{ env.PLATFORMS }}
push: true
tags: |
ghcr.io/atlanhq/pyatlan-chainguard-base:${{ env.IMAGE_TAG }}
${{ env.HARBOR_TAGS }}
build-args: |
PYTHON_VERSION=${{ env.PYTHON_VERSION }}
PYATLAN_VERSION=${{ env.PYATLAN_VERSION }}
PYATLAN_COMMIT_SHA=${{ env.PYATLAN_COMMIT_SHA }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Output image information
run: |
echo "## 🐳 Chainguard Docker Image Built Successfully!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Image Details:" >> $GITHUB_STEP_SUMMARY
echo "- **Base Image:** Chainguard pyatlan-golden:3.11" >> $GITHUB_STEP_SUMMARY
echo "- **Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Build Type:** ${{ env.BUILD_TYPE }}" >> $GITHUB_STEP_SUMMARY
echo "- **Build Method:** Multi-stage from GitHub source (no PyPI)" >> $GITHUB_STEP_SUMMARY
echo "- **Python Version:** ${{ env.PYTHON_VERSION }}" >> $GITHUB_STEP_SUMMARY
if [ -n "${{ env.PYATLAN_COMMIT_SHA }}" ]; then
echo "- **Pyatlan Source:** Git commit/branch ${{ env.PYATLAN_COMMIT_SHA }}" >> $GITHUB_STEP_SUMMARY
else
echo "- **Pyatlan Source:** Git tag v${{ env.PYATLAN_VERSION }}" >> $GITHUB_STEP_SUMMARY
fi
echo "- **Dependencies:** Hardened from Chainguard APK + minimal pip" >> $GITHUB_STEP_SUMMARY
echo "- **Platforms:** ${{ env.PLATFORMS }}" >> $GITHUB_STEP_SUMMARY
if [ "${{ env.BUILD_TYPE }}" = "dev" ]; then
echo "- **Image Tag Suffix:** ${{ env.COMMIT_HASH }}" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Available Tag:" >> $GITHUB_STEP_SUMMARY
echo "- \`ghcr.io/atlanhq/pyatlan-chainguard-base:${{ env.IMAGE_TAG }}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Usage in your Dockerfile:" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`dockerfile" >> $GITHUB_STEP_SUMMARY
echo "FROM ghcr.io/atlanhq/pyatlan-chainguard-base:${{ env.IMAGE_TAG }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "# Your application code here" >> $GITHUB_STEP_SUMMARY
echo "COPY your-package/ /app/" >> $GITHUB_STEP_SUMMARY
echo "RUN uv pip install --system -r requirements.txt" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "CMD [\"python\", \"your-app.py\"]" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY