diff --git a/.github/workflows/updatecli.yml b/.github/workflows/updatecli.yml index 244d457d18..d562f4d55c 100644 --- a/.github/workflows/updatecli.yml +++ b/.github/workflows/updatecli.yml @@ -27,6 +27,8 @@ jobs: - name: Install Updatecli uses: updatecli/updatecli-action@v2 + with: + version: v0.72.0 - name: Delete leftover UpdateCLI branches run: | diff --git a/updatecli/scripts/update_chart_and_images.sh b/updatecli/scripts/update_chart_and_images.sh new file mode 100755 index 0000000000..00ae82929a --- /dev/null +++ b/updatecli/scripts/update_chart_and_images.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +info() +{ + echo '[INFO] ' "$@" +} +warn() +{ + echo '[WARN] ' "$@" >&2 +} +fatal() +{ + echo '[ERROR] ' "$@" >&2 + exit 1 +} + +update_chart_version() { + info "updating chart ${1} in ${CHART_VERSIONS_FILE}" + CURRENT_VERSION=$(yq -r '.charts[] | select(.filename == "/charts/'"${1}"'.yaml") | .version' ${CHART_VERSIONS_FILE}) + NEW_VERSION=${2} + if [ "${CURRENT_VERSION}" != "${NEW_VERSION}" ]; then + info "found version ${CURRENT_VERSION}, updating to ${NEW_VERSION}" + chart_updated=true + if test "$DRY_RUN" == "false"; then + sed -i "s/${CURRENT_VERSION}/${NEW_VERSION}/g" ${CHART_VERSIONS_FILE} + else + info "dry-run is enabled, no changes will occur" + fi + else + info "no new version found" + fi +} + +update_chart_images() { + info "downloading chart ${1} version ${2} to extract image versions" + CHART_URL="https://github.com/rancher/rke2-charts/raw/main/assets/${1}/${1}-${2}.tgz" + curl -s -L ${CHART_URL} | tar xzv ${1}/values.yaml 1> /dev/null + if test "$chart_updated" == "true"; then + # get all images and tags for the latest constraint + IMAGES_TAG=$(yq -y -r '.versionOverrides[] | select( .constraint == "~ 1.27" or .constraint == ">= 1.24 < 1.28") | .values' ${1}/values.yaml | grep -E "repo|tag") + while IFS= read -r line ; do + if grep "repo" <<< ${line} &> /dev/null; then + image=${line#*: } + tag_line=$(echo "${IMAGES_TAG}" | grep -A1 ${image} 2>&1| sed -n '2 p' | tr -d " ") + tag=${tag_line#*:} + target_image=$(grep ${image} ${CHART_AIRGAP_IMAGES_FILE}) + if [ -z "${target_image}" ]; then + fatal "image ${image} not found in the airgap scripts" + fi + target_tag=${target_image#*:} + if [ "$target_tag" != "${tag}" ]; then + info updating image ${image} in airgap script from version ${target_tag} to ${tag} + if test "$DRY_RUN" == "false"; then + sed -r -i 's~(.*'${image}':).*~\1'${tag}'~g' ${CHART_AIRGAP_IMAGES_FILE} + else + info "dry-run is enabled, no changes will occur" + fi + else + info "image ${image} did not update from version ${tag}" + fi + else + continue + fi + done <<< "$IMAGES_TAG" + else + info "no new version found" + fi + # removing downloaded artifacts + rm -rf ${1}/ +} + +CHART_VERSIONS_FILE="charts/chart_versions.yaml" +CHART_AIRGAP_IMAGES_FILE="scripts/build-images" + + +CHART_NAME=${1} +CHART_VERSION=${2} +chart_updated=false + +update_chart_version ${CHART_NAME} ${CHART_VERSION} +update_chart_images ${CHART_NAME} ${CHART_VERSION} diff --git a/updatecli/scripts/validate_version.sh b/updatecli/scripts/validate_version.sh new file mode 100755 index 0000000000..733fa07a60 --- /dev/null +++ b/updatecli/scripts/validate_version.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +info() +{ + echo '[INFO] ' "$@" +} +warn() +{ + echo '[WARN] ' "$@" >&2 +} +fatal() +{ + echo '[ERROR] ' "$@" >&2 + exit 1 +} + + +CHART_VERSIONS_FILE="charts/chart_versions.yaml" + + +CHART_NAME=${1} +CHART_VERSION=${2} + +CURRENT_VERSION=$(yq -r '.charts[] | select(.filename == "/charts/'"${1}"'.yaml") | .version' ${CHART_VERSIONS_FILE}) +if [ "${CURRENT_VERSION}" != "${CHART_VERSION}" ]; then + info "chart ${CHART_NAME} should be updated from version ${CURRENT_VERSION} to ${CHART_VERSION}" + exit 0 +fi +fatal "chart ${CHART_NAME} has the latest version" \ No newline at end of file diff --git a/updatecli/updatecli.d/updatecli.yml b/updatecli/updatecli.d/updatecli.yml deleted file mode 100644 index bac8b79fd1..0000000000 --- a/updatecli/updatecli.d/updatecli.yml +++ /dev/null @@ -1,81 +0,0 @@ -# This small test makes sure that updatecli is working properly on a repo. -# To test this: -# have "UPDATECLI_GITHUB_ACTOR" env set to your github username -# have "UPDATECLI_GITHUB_TOKEN" env set to your github token -# have the latest version of updatecli installed -# 'updatecli diff -v updatecli/values.yaml -c updatecli/updatecli.d/updatecli.yml' -# In the future, more useful files should be added to this directory. ---- -name: "Introduce updatecli to repo and validate basic functionality" -# Make sure we can pull in github repos from multiple orgs -scms: - rke2: - kind: "github" - spec: - user: "{{ .github.user }}" - email: "{{ .github.email }}" - username: "{{ requiredEnv .github.username }}" - token: '{{ requiredEnv .github.token }}' - owner: rancher - repository: rke2 - branch: master - go: - kind: "github" - spec: - user: "{{ .github.user }}" - email: "{{ .github.email }}" - username: "{{ requiredEnv .github.username }}" - token: '{{ requiredEnv .github.token }}' - owner: golang - repository: go - branch: master - -sources: - # validate gittag parsing external public repos - goTag: - name: "Get Go 1.20.2 tag" - kind: "gittag" - scmid: "go" - spec: - versionfilter: - kind: "regex" - pattern: '^go1\.20\.2$' - -# Validate read access to local repo -## continue to targets if the go version in the validate file doesn't match the goTag source -conditions: - testVersionShouldMatchGoTag: - name: - kind: yaml - sourceid: goTag - spec: - file: "updatecli/validate.yml" - key: version - failwhen: true #if set to true, continue to targets when condition is true rather than false - -# Validate the ability to generate branches, commits, what the commits look like, and what branches look like -## allow validation of workflow to delete unused branch after merge -## generate a commit on a branch named updatecli_<256 sha of change> -## the commit message will be automatically generated by updatecli based on the change -targets: - updateValidateFile: - name: "Update the version in the validate file" - kind: "yaml" - scmid: "rke2" - sourceid: goTag - spec: - file: "updatecli/validate.yml" - key: version - -# Validate generating a pull request -actions: - # create a pull request which is not allowed to automerge - # the title matches the commit message - github: - kind: "github/pullrequest" - scmid: "rke2" - spec: - automerge: false - draft: false - mergemethod: squash - parent: false # this would allow for making a PR to an upstream fork, if we ran updatecli from a fork diff --git a/updatecli/updatecli.d/vsphere-cpi.yml b/updatecli/updatecli.d/vsphere-cpi.yml new file mode 100644 index 0000000000..c2f7f3a5e1 --- /dev/null +++ b/updatecli/updatecli.d/vsphere-cpi.yml @@ -0,0 +1,59 @@ +# This small test makes sure that updatecli is working properly on a repo. +# To test this: +# have "UPDATECLI_GITHUB_ACTOR" env set to your github username +# have "UPDATECLI_GITHUB_TOKEN" env set to your github token +# have the latest version of updatecli installed +# 'updatecli diff -v updatecli/values.yaml -c updatecli/updatecli.d/vsphere-cpi.yml' +# In the future, more useful files should be added to this directory. +--- +name: "Update vsphere csi/cpi charts and images" +# Make sure we can pull in github repos from multiple orgs +scms: + rke2: + kind: "github" + spec: + user: "{{ .github.user }}" + email: "{{ .github.email }}" + username: "{{ requiredEnv .github.username }}" + token: '{{ requiredEnv .github.token }}' + owner: rancher + repository: rke2 + branch: master + +sources: + vsphere-cpi: + name: "Get vsphere-cpi chart version" + kind: "helmchart" + spec: + url: https://rancher.github.io/rke2-charts + name: rancher-vsphere-cpi + versionfilter: + kind: "latest" + +conditions: + vsphereCPIVersionShouldBeUpdated: + name: "Check if vsphere-cpi chart should be updated or not" + kind: shell + sourceid: vsphere-cpi + spec: + command: bash ./updatecli/scripts/validate_version.sh rancher-vsphere-cpi + +targets: + updateVsphereCPI: + name: "Update the vsphere-cpi airgap images" + kind: "shell" + scmid: "rke2" + sourceid: vsphere-cpi + spec: + command: bash ./updatecli/scripts/update_chart_and_images.sh rancher-vsphere-cpi + +actions: + github: + kind: "github/pullrequest" + scmid: "rke2" + spec: + automerge: false + draft: false + mergemethod: squash + parent: false + title: "Update vsphere-cpi chart" diff --git a/updatecli/updatecli.d/vsphere-csi.yml b/updatecli/updatecli.d/vsphere-csi.yml new file mode 100644 index 0000000000..1ed0ac3ce5 --- /dev/null +++ b/updatecli/updatecli.d/vsphere-csi.yml @@ -0,0 +1,59 @@ +# This small test makes sure that updatecli is working properly on a repo. +# To test this: +# have "UPDATECLI_GITHUB_ACTOR" env set to your github username +# have "UPDATECLI_GITHUB_TOKEN" env set to your github token +# have the latest version of updatecli installed +# 'updatecli diff -v updatecli/values.yaml -c updatecli/updatecli.d/vsphere-csi.yml' +# In the future, more useful files should be added to this directory. +--- +name: "Update vsphere csi/cpi charts and images" +# Make sure we can pull in github repos from multiple orgs +scms: + rke2: + kind: "github" + spec: + user: "{{ .github.user }}" + email: "{{ .github.email }}" + username: "{{ requiredEnv .github.username }}" + token: '{{ requiredEnv .github.token }}' + owner: rancher + repository: rke2 + branch: master + +sources: + vsphere-csi: + name: "Get vsphere-csi chart version" + kind: "helmchart" + spec: + url: https://rancher.github.io/rke2-charts + name: rancher-vsphere-csi + versionfilter: + kind: "latest" + +conditions: + vsphereCSIVersionShouldBeUpdated: + name: "Check if vsphere-csi chart should be updated or not" + kind: shell + sourceid: vsphere-csi + spec: + command: bash ./updatecli/scripts/validate_version.sh rancher-vsphere-csi + +targets: + updateVsphereCSI: + name: "Update the vsphere-csi airgap images" + kind: "shell" + scmid: "rke2" + sourceid: vsphere-csi + spec: + command: bash ./updatecli/scripts/update_chart_and_images.sh rancher-vsphere-csi + +actions: + github: + kind: "github/pullrequest" + scmid: "rke2" + spec: + automerge: false + draft: false + mergemethod: squash + parent: false + title: "Update vsphere-csi chart" diff --git a/updatecli/validate.yml b/updatecli/validate.yml deleted file mode 100644 index ce81ec9146..0000000000 --- a/updatecli/validate.yml +++ /dev/null @@ -1 +0,0 @@ -version: go1.20.2