Skip to content

Merge pull request #222 from rynge/vo-frontend-3108 #1034

Merge pull request #222 from rynge/vo-frontend-3108

Merge pull request #222 from rynge/vo-frontend-3108 #1034

---
name: Build and push container images
on:
push:
pull_request:
workflow_dispatch:
repository_dispatch:
types: [dispatch-build]
jobs:
make-date-tag:
runs-on: ubuntu-latest
outputs:
dtag: ${{ steps.mkdatetag.outputs.dtag }}
steps:
- name: make date tag
id: mkdatetag
run: echo "dtag=$(date +%Y%m%d-%H%M)" >> $GITHUB_OUTPUT
build-image-list:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
image_list: ${{ steps.image-list.outputs.image_list }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- id: image-list
run: |
ORG_DIR=opensciencegrid
# Get the list of files changed based on the type of event
# kicking off the GHA:
# 1. For the main branch, diff the previous state of main vs
# the current commit
# 2. For other branches (i.e., on someone's fork), diff main
# vs the current commit
# 3. For PRs, diff the base ref vs the current commit
# 4. For everything else (e.g., dispatches), build all images
if [[ $GITHUB_EVENT_NAME == 'pull_request' ]] ||
[[ $GITHUB_EVENT_NAME == 'push' ]]; then
if [[ $GITHUB_EVENT_NAME == 'pull_request' ]]; then
BASE=$(git merge-base origin/$GITHUB_BASE_REF HEAD)
elif [[ $GITHUB_REF == 'refs/heads/main' ]]; then
BASE=${{github.event.before}}
else
BASE=origin/main
fi
# List image root dirs where files have changed and the
# root dir exists. Example value:
# "opensciencegrid/vo-frontend opensciencegrid/ospool-cm"
images=$(git diff --name-only \
"$BASE" \
"$GITHUB_SHA" |
egrep "^$ORG_DIR/" |
cut -d/ -f -2 |
sort |
uniq |
xargs -I {} find . -type d \
-wholename ./{} \
-printf "%P\n")
else
# List all image root dirs. Example value:
# "opensciencegrid/vo-frontend opensciencegrid/ospool-cm"
images=$(find $ORG_DIR -mindepth 1 \
-maxdepth 1 \
-type d \
-printf "$ORG_DIR/%P\n")
fi
image_json=$(echo -n "${images:-dummy}" | jq -Rcs '.|split("\n") | map(select(. != ""))')
echo "$image_json" > image_list.json
echo "images=$(echo $images | tr '\n' ' ')" >> $GITHUB_OUTPUT
echo "image_list=$image_json" >> $GITHUB_OUTPUT
- name: Display image list
run: cat image_list.json
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Set matrix output
id: set-matrix
run: |
# Run Python script and capture JSON output
matrix_json=$(python scripts/build-job-matrix.py ${{ steps.image-list.outputs.images }} | tail -n +2)
# Use jq to extract the 'include' part of the JSON
matrix=$(echo "$matrix_json" | jq -c '.include')
echo "::set-output name=matrix::$matrix"
- name: Verify matrix content
run: |
echo "Content of matrix:"
echo "${{ steps.set-matrix.outputs.matrix }}"
build:
runs-on: ubuntu-latest
needs: build-image-list
if: ${{ needs.build-image-list.outputs.image_list != '["dummy"]' }}
# Prevent a single build failure from killing the workflow.
# This is safe since subsequent pushes should fail on cache load
continue-on-error: true
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.build-image-list.outputs.matrix) }}
steps:
- uses: actions/checkout@v3
# Example of a matrix configuration string:
# {el9-23-development-True-False}
- name: Print raw matrix configuration
run: |
echo "Raw matrix configuration: ${{ matrix.config }}"
- name: Set environment variables
id: set-env-vars
run: |
CONFIG="${{ matrix.config }}"
BASE_OS=$(echo $CONFIG | awk -F'-' '{print $1}')
OSG_SERIES=$(echo $CONFIG | awk -F'-' '{print $2}')
BASE_REPO=$(echo $CONFIG | awk -F'-' '{print $3}')
CONTEXT="opensciencegrid/${{ matrix.name }}"
echo "BASE_OS=${BASE_OS}" >> $GITHUB_ENV
echo "OSG_SERIES=${OSG_SERIES}" >> $GITHUB_ENV
echo "BASE_REPO=${BASE_REPO}" >> $GITHUB_ENV
echo "CONTEXT=${CONTEXT}" >> $GITHUB_ENV
- name: Validate Environment Variables
run: |
echo "Validating environment variables:"
if [ -z "$BASE_OS" ] || [ -z "$OSG_SERIES" ] || [ -z "$BASE_REPO" ] || [ -z "$CONTEXT" ]; then
echo "Error: One or more environment variables are not set."
exit 1
else
echo "All required environment variables are set."
fi
- name: Build Image
continue-on-error: ${{ matrix.yum_repo == 'development' }}
uses: opensciencegrid/[email protected]
with:
osg_series: ${{ env.OSG_SERIES }}
osg_repo: ${{ env.BASE_REPO }}
context: ${{ env.CONTEXT }}
base_os: ${{ env.BASE_OS }}
push:
runs-on: ubuntu-latest
if: >-
github.ref == 'refs/heads/main' &&
github.event_name != 'pull_request' &&
github.repository_owner == 'opensciencegrid' &&
needs.build-image-list.outputs.image_list != '["dummy"]'
needs: [make-date-tag, build-image-list, build]
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.build-image-list.outputs.matrix) }}
steps:
- uses: actions/checkout@v3
# Example of a matrix configuration string:
# {el9-23-development-True-False}
- name: Print raw matrix configuration
run: |
echo "Raw matrix configuration: ${{ matrix.config }}"
- name: Set environment variables
id: set-env-vars
run: |
CONFIG="${{ matrix.config }}"
BASE_OS=$(echo $CONFIG | awk -F'-' '{print $1}')
OSG_SERIES=$(echo $CONFIG | awk -F'-' '{print $2}')
BASE_REPO=$(echo $CONFIG | awk -F'-' '{print $3}')
CONTEXT="opensciencegrid/${{ matrix.name }}"
echo "BASE_OS=${BASE_OS}" >> $GITHUB_ENV
echo "OSG_SERIES=${OSG_SERIES}" >> $GITHUB_ENV
echo "BASE_REPO=${BASE_REPO}" >> $GITHUB_ENV
echo "CONTEXT=${CONTEXT}" >> $GITHUB_ENV
- name: Validate Environment Variables
run: |
echo "Validating environment variables:"
if [ -z "$BASE_OS" ] || [ -z "$OSG_SERIES" ] || [ -z "$BASE_REPO" ] || [ -z "$CONTEXT" ]; then
echo "Error: One or more environment variables are not set."
exit 1
else
echo "All required environment variables are set."
fi
- name: Push to Harbor (${OSG_SERIES}-${BASE_REPO})
uses: opensciencegrid/push-container-action@main
with:
repo: ${{ env.BASE_REPO }}
osg_series: ${{ env.OSG_SERIES }}
context: ${{ env.CONTEXT }}
base_os: ${{ env.BASE_OS }}
registry_url: hub.opensciencegrid.org
registry_user: ${{ secrets.OSG_HARBOR_ROBOT_USER }}
registry_pass: ${{ secrets.OSG_HARBOR_ROBOT_PASSWORD }}
- name: Push to Docker Hub (${OSG_SERIES}-${BASE_REPO})
uses: opensciencegrid/push-container-action@main
with:
repo: ${{ env.BASE_REPO }}
osg_series: ${{ env.OSG_SERIES }}
context: ${{ env.CONTEXT }}
base_os: ${{ env.BASE_OS }}
registry_url: docker.io
registry_user: ${{ secrets.DOCKER_USERNAME }}
registry_pass: ${{ secrets.DOCKER_PASSWORD }}