Skip to content

Sync ODH-notebooks with codeflare-sdk release #46

Sync ODH-notebooks with codeflare-sdk release

Sync ODH-notebooks with codeflare-sdk release #46

# The aim of this GitHub workflow is to update the pipfile to sync with Codeflare-SDK release.
name: Sync ODH-notebooks with codeflare-sdk release
on:
workflow_dispatch:
inputs:
upstream-repository-organization:
required: true
description: "Owner of target upstream notebooks repository used to open a PR against"
default: "opendatahub-io"
codeflare-repository-organization:
required: true
description: "Owner of origin notebooks repository used to open a PR"
default: "project-codeflare"
codeflare_sdk_release_version:
required: true
description: "Provide version of the Codeflare-SDK release"
env:
BRANCH_NAME: main
CODEFLARE_RELEASE_VERSION: ${{ github.event.inputs.codeflare_sdk_release_version }}
UPDATER_BRANCH: odh-sync-updater-${{ github.run_id }}
UPSTREAM_OWNER: ${{ github.event.inputs.upstream-repository-organization }}
REPO_OWNER: ${{ github.event.inputs.codeflare-repository-organization }}
REPO_NAME: notebooks
GITHUB_TOKEN: ${{ secrets.CODEFLARE_MACHINE_ACCOUNT_TOKEN }}
MINIMUM_SUPPORTED_PYTHON_VERSION: 3.9
jobs:
build:
runs-on: ubuntu-22.04-8core
steps:
- name: Clone repository and Sync
run: |
git clone https://x-access-token:${GITHUB_TOKEN}@github.com/$REPO_OWNER/$REPO_NAME.git $REPO_NAME
cd $REPO_NAME
git remote add upstream https://github.com/$UPSTREAM_OWNER/$REPO_NAME.git
git config --global user.email "[email protected]"
git config --global user.name "codeflare-machine-account"
git remote -v
git pull upstream main && git push origin main
- name: Setup Python environment
uses: actions/setup-python@v4
with:
python-version: |
3.9
3.11
cache: 'pipenv'
- name: Install pipenv and pip-versions
run: pip install pipenv pip-versions
- name: Update Pipfiles in accordance with Codeflare-SDK latest release
run: |
package_name=codeflare-sdk
available_python_versions=("3.9", "3.11") # add space separated python versions according to 'python-versions' specified in 'Setup Python Environment' step
install_package_using_pipenv(){
# args allow custom names for Pipfile and Pipfile.lock
if $# -eq 2; then
mv $1 Pipfile
mv $2 Pipfile.lock
fi
if ! pipenv install ${package_name}~="${CODEFLARE_RELEASE_VERSION}"; then
echo "Failed to install ${package_name} with version ${CODEFLARE_RELEASE_VERSION} in $dir"
exit 1
fi
# Lock dependencies, ensuring pre-release are included and clear previous state
if ! pipenv lock --pre --clear ; then
echo "Failed to lock dependencies"
exit 1
fi
# remove virtual env and clear cache
if ! pipenv --rm --clear ; then
echo "Failed to remove virtual environment"
exit 1
fi
if $# -eq 2; then
mv Pipfile $1
mv Pipfile.lock $2
fi
}
# Get the list of available versions for the package
if ! versions=$(pipenv run pip-versions list $package_name);then
echo "Failed to retrieve versions for $package_name"
exit 1
fi
# Check if the desired version exists in the list
if echo "$versions" | grep -q "${CODEFLARE_RELEASE_VERSION}"; then
echo "Version ${CODEFLARE_RELEASE_VERSION} is available for $package_name"
# list all Pipfile paths having Codeflare-SDK listed
# Extracting only directories from file paths, excluding a `.gitworkflow` and `.git` directory
directories+=($(grep --exclude-dir=.git --exclude-dir=.github --include="Pipfile*" -rl "${package_name} = \"~=.*\"" | xargs dirname | sort | uniq))
counter=0
total=${#directories[@]}
for dir in "${directories[@]}"; do
counter=$((counter+1))
echo "--Processing directory $counter '$dir' of total $total"
cd "$dir"
minimum_supported_python_version_major=$(echo "${MINIMUM_SUPPORTED_PYTHON_VERSION}" | awk -F '.' '{print $1}') #integer of MINIMUM_SUPPORTED_PYTHON_VERSION env variable
minimum_supported_python_version_minor=$(echo "${MINIMUM_SUPPORTED_PYTHON_VERSION}" | awk -F '.' '{print $2}') #decimal of MINIMUM_SUPPORTED_PYTHON_VERSION env variable
if ! [ -f "Pipfile" ]; then
if [ -f "Pipfile.cpu" ]; then
pipfile_python_version=$(grep -E '^python_version' ./Pipfile.cpu | cut -d '"' -f 2) # extracted from pipfile.cpu
fi
else
pipfile_python_version=$(grep -E '^python_version' ./Pipfile | cut -d '"' -f 2) # extracted from pipfile
fi
pipfile_python_version_major=$(echo "$pipfile_python_version" | awk -F '.' '{print $1}')
pipfile_python_version_minor=$(echo "$pipfile_python_version" | awk -F '.' '{print $2}')
if [[ " ${available_python_versions[@]} " =~ " ${pipfile_python_version} " && "$pipfile_python_version_major" -ge "$minimum_supported_python_version_major" && "$pipfile_python_version_minor" -ge "$minimum_supported_python_version_minor" ]]; then
if ! [ -f "Pipfile" ]; then
if [ -f "Pipfile.cpu" ]; then
install_package_using_pipenv Pipfile.cpu Pipfile.lock.cpu
fi
if [ -f "Pipfile.gpu" ]; then
install_package_using_pipenv Pipfile.gpu Pipfile.lock.gpu
fi
else
#install specified package
install_package_using_pipenv
fi
else
echo "Skipped installation of ${package_name} with version ${CODEFLARE_RELEASE_VERSION} in $dir"
fi
cd -
echo "$((total-counter)) directories remaining.."
done
else
versions_list=$(echo "$versions" | tr '\n' ' ' | sed 's/, $//')
versions="${versions_list%,}"
echo "Version '${CODEFLARE_RELEASE_VERSION}' is not available for $package_name"
echo "Available versions for $package_name: $versions"
exit 1
fi
- name: Push changes
run: |
cd $REPO_NAME
git add . && git status && git checkout -b ${{ env.UPDATER_BRANCH }} && \
git commit -am "Updated notebooks via ${{ env.UPDATER_BRANCH }} GitHub action" --signoff &&
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/$REPO_OWNER/$REPO_NAME.git
git push origin ${{ env.UPDATER_BRANCH }}
- name: Create Pull Request
run: |
gh pr create --repo $UPSTREAM_OWNER/$REPO_NAME \
--title "$pr_title" \
--body "$pr_body" \
--head $REPO_OWNER:$UPDATER_BRANCH \
--base $BRANCH_NAME
env:
pr_title: "[Codeflare Action] Update notebook's pipfile to sync with Codeflare-SDK release ${{ env.CODEFLARE_RELEASE_VERSION }}"
pr_body: |
:rocket: This is an automated Pull Request.
This PR updates the `Pipfile` to sync with latest Codeflare-SDK release.