- yq
- gh
- gh logged into github
First arg is always .github folder
| #!/usr/bin/env bash | |
| GITHUB_DIR=$1 | |
| if ! command -v yq &> /dev/null; then | |
| echo "yq could not be found" | |
| echo "If on mac, try brew install yq" | |
| exit 1 | |
| fi | |
| if ! command -v gh &> /dev/null; then | |
| echo "gh could not be found" | |
| echo "If on mac, try brew install gh" | |
| echo "After installation run, gh auth login" | |
| exit 1 | |
| fi | |
| function getLatest() { | |
| local owner=$1 | |
| local repo=$2 | |
| gh release -R "$owner/$repo" list --exclude-drafts --exclude-pre-releases | grep Latest | awk -F '\t' '{if (match($3, "^v*\.*\.*")) print $3}' | |
| } | |
| echo "" | |
| echo "" | |
| function processWorkflow() { | |
| local FILE=$1 | |
| echo "$FILE" | |
| local CONTENTS | |
| CONTENTS="$(cat "$FILE")" | |
| local REUSABLE_WORKFLOWS | |
| REUSABLE_WORKFLOWS=$(yq '.jobs[] .uses' < "$FILE") | |
| local STEPS | |
| STEPS=$(yq '.jobs[] .steps[] .uses' < "$FILE") | |
| captures=( $REUSABLE_WORKFLOWS $STEPS ) | |
| for job in "${captures[@]}"; do | |
| if [ "$job" != "null" ] && [[ ! "$job" =~ ^\./\.github ]]; then | |
| OWNER=$(echo "$job" | cut -d '/' -f 1) | |
| REPO=$(echo "$job" | cut -d '/' -f 2 | cut -d '@' -f 1) | |
| JOB_INFO="$(echo "$job" | cut -d '@' -f 1)" | |
| CURRENT_VERSION="$(echo "$job" | cut -d '@' -f 2)" | |
| LATEST_VERSION=$(getLatest "$OWNER" "$REPO") | |
| CONTENTS=${CONTENTS//"$JOB_INFO@$CURRENT_VERSION"/"$JOB_INFO@$LATEST_VERSION"} | |
| fi | |
| done | |
| echo "$CONTENTS" > "$FILE" | |
| } | |
| function processAction() { | |
| local FILE=$1 | |
| echo "$FILE" | |
| local CONTENTS | |
| CONTENTS="$(cat "$FILE")" | |
| local STEPS | |
| STEPS=$(yq '.runs.steps[] .uses' < "$FILE") | |
| captures=( $STEPS ) | |
| for job in "${captures[@]}"; do | |
| if [ "$job" != "null" ] && [[ ! "$job" =~ ^\./\.github ]]; then | |
| OWNER=$(echo "$job" | cut -d '/' -f 1) | |
| REPO=$(echo "$job" | cut -d '/' -f 2 | cut -d '@' -f 1) | |
| JOB_INFO="$(echo "$job" | cut -d '@' -f 1)" | |
| CURRENT_VERSION="$(echo "$job" | cut -d '@' -f 2)" | |
| LATEST_VERSION=$(getLatest "$OWNER" "$REPO") | |
| CONTENTS=${CONTENTS//"$JOB_INFO@$CURRENT_VERSION**"/"$JOB_INFO@$LATEST_VERSION"} | |
| fi | |
| done | |
| echo "$CONTENTS" > "$FILE" | |
| } | |
| IFS=$'\n' | |
| YML_WORKFLOWS=$(find -f $GITHUB_DIR/workflows/*.yml) | |
| YAML_WORKFLOWS=$(find -f $GITHUB_DIR/workflows/*.yaml || "") | |
| YML_ACTIONS=$(find -f $GITHUB_DIR/actions/**/*.yml) | |
| #YAML_ACTIONS=$(find -f ./actions/**/*.yaml) | |
| yaml_files=( $YML_WORKFLOWS $YAML_WORKFLOWS $YML_ACTIONS ) | |
| unset IFS | |
| for i in "${yaml_files[@]}"; do | |
| FILE=$(realpath "$i") | |
| if [[ "$FILE" =~ "workflows" ]]; then | |
| processWorkflow "$FILE" | |
| elif [[ "$FILE" =~ "actions" ]]; then | |
| processAction "$FILE" | |
| else | |
| echo "Unsupported" | |
| fi | |
| done |