Sync ODH-notebooks with codeflare-sdk release #59
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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" | |
notebooks-target-branch: | |
required: true | |
description: "Target branch of upstream repository" | |
default: "main" | |
python-version: | |
required: true | |
description: "Provide the python version to be used for the notebooks" | |
default: "3.11" | |
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: ${{ github.event.inputs.notebooks-target-branch }} | |
PYTHON_VERSION: ${{ github.event.inputs.python-version }} | |
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 fetch upstream $BRANCH_NAME | |
git checkout $BRANCH_NAME | |
- name: Setup Python environment | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
cache: 'pipenv' | |
- name: Install pipenv and pip-versions | |
run: pip install pipenv==2024.0.3 pip-versions | |
- name: Update Pipfiles in accordance with Codeflare-SDK latest release | |
run: | | |
package_name=codeflare-sdk | |
available_python_versions=("$PYTHON_VERSION") # 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 | |
# replace existing version of cf-sdk with new version in Pipfile | |
sed -i "s/codeflare-sdk = .*$/codeflare-sdk = \"~=$CODEFLARE_RELEASE_VERSION\"/g" Pipfile | |
# 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 generated by [odh-notebooks-sync.yml](https://github.com/project-codeflare/codeflare-sdk/blob/main/.github/workflows/odh-notebooks-sync.yml) workflow. | |
This PR updates the `Pipfile` to sync with latest Codeflare-SDK release. |