| #!/bin/bash |
| set -x |
| |
| echo "########################################################################" |
| echo " Gerrit Environment" |
| env | grep '^GERRIT' |
| echo "########################################################################" |
| |
| set -e |
| |
| if [ "${GERRIT_PROJECT}" == "TF-A/trusted-firmware-a" ]; then |
| # For real production project, non-sandbox run goes to production RTD project, |
| # while for sandbox run to a separate RTD project. |
| if [ "${SANDBOX_RUN}" == "false" ]; then |
| RTD_PROJECT="trustedfirmware-a" |
| RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/trustedfirmware-a/87181/" |
| RTD_WEBHOOK_SECRET_KEY=${RTD_WEBHOOK_SECRET} |
| RTD_API_TOKEN=${RTD_API_TOKEN} |
| else |
| RTD_PROJECT="trustedfirmware-a-sandbox" |
| RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/trustedfirmware-a-sandbox/263958/" |
| RTD_WEBHOOK_SECRET_KEY=${TFA_SANDBOX_RTD_WEBHOOK_SECRET} |
| RTD_API_TOKEN=${PFALCON_RTD_API_TOKEN} |
| fi |
| elif [ "${GERRIT_PROJECT}" == "sandbox/pfalcon/trusted-firmware-a" ]; then |
| # For test project, both "production" and "sandbox" go to the same elsewhere project. |
| RTD_PROJECT="pfalcon-trustedfirmware-a-sandbox" |
| RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/pfalcon-trustedfirmware-a-sandbox/263459/" |
| RTD_WEBHOOK_SECRET_KEY=${PFALCON_RTD_WEBHOOK_SECRET} |
| RTD_API_TOKEN=${PFALCON_RTD_API_TOKEN} |
| else |
| echo "Unknown GERRIT_PROJECT: ${GERRIT_PROJECT}" |
| exit 1 |
| fi |
| |
| RTD_API="https://readthedocs.org/api/v3/projects/${RTD_PROJECT}" |
| RTD_VER_API="${RTD_API}/versions" |
| |
| new_tag="" |
| new_slug="" |
| refname=${GERRIT_REFNAME##*/} |
| lts_branch=${refname} |
| if echo ${GERRIT_REFNAME} | grep -q "refs/tags/"; then |
| new_tag=${GERRIT_REFNAME#refs/tags/} |
| # Convert tag to ReadTheDocs version slug |
| new_slug=$(echo ${new_tag} | tr '[A-Z]/' '[a-z]-') |
| lts_branch=${refname%.*} |
| fi |
| |
| function rtd_rest_api() { |
| uri="$1" |
| jqfilt="$2" |
| resp=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" "$uri") |
| echo $resp 1>&2 |
| echo $resp | jq -r "$jqfilt" |
| } |
| |
| function activate_version() { |
| version=$1 |
| max_retry_time=20 |
| retry=0 |
| |
| # Check whether we need to activate a tag or a branch. If it's a tag, create a branch variable |
| echo ${version} | grep -q "lts-v[0-9].*\.[0-9].*\.[0-9].*" && branch=${version%.*} |
| |
| ver_slug=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${version}/ | \ |
| jq -r '.slug') |
| |
| while [ "${ver_slug}" != "${version}" ]; |
| do |
| [ ${retry} -gt ${max_retry_time} ] && break |
| sleep 30 |
| retry=$((retry+1)) |
| ver_slug=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${version}/ | \ |
| jq -r '.slug') |
| done |
| |
| # activate and hide the branch |
| if [ -n "${branch}" ]; then |
| curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
| -d "{\"active\": true, \"hidden\": true}" ${RTD_VER_API}/${branch}/ |
| fi |
| |
| if [ ${retry} -le ${max_retry_time} ]; then |
| echo "Active new version: ${version}" |
| curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
| -d "{\"active\": true, \"hidden\": false}" ${RTD_VER_API}/${version}/ |
| else |
| echo "RTD can not find the version: ${version}" |
| exit 1 |
| fi |
| } |
| |
| function wait_for_build() { |
| version=$1 |
| retry=0 |
| while true; do |
| status=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" "${RTD_API}/builds/" | \ |
| jq -r ".results | map(select(.version==\"$version\")) | .[0].state.code") |
| echo $status |
| if [ "$status" == "finished" ]; then |
| break |
| fi |
| |
| retry=$((retry + 1)) |
| if [ $retry -gt 40 ]; then |
| echo "Could not confirm that ReadTheDoc slug ${version} was built in the alloted time." |
| break |
| fi |
| |
| sleep 30 |
| done |
| } |
| |
| echo "Notifying ReadTheDocs of changes" |
| curl -s -X POST -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${lts_branch}/builds/ |
| |
| # Triggered by a new tag |
| if [ -n "${new_tag}" ]; then |
| echo -e "\nNew release tag: ${new_tag}, slug: ${new_slug}" |
| # Hide the current active and visible version |
| old_tags=$(rtd_rest_api "${RTD_VER_API}/?slug=${lts_branch}&type=tag&active=true" '.results | map(select(.hidden == false) | .slug) | .[]') |
| for t in ${old_tags}; |
| do |
| echo "Hide old version: ${t}" |
| curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
| -d "{\"hidden\": true}" ${RTD_VER_API}/${t}/ |
| done |
| # Active the new version |
| echo "Active new version: ${new_slug}" |
| activate_version ${new_slug} |
| |
| wait_for_build ${new_slug} |
| echo "Docs for the new release are available at: https://${RTD_PROJECT}.readthedocs.io/en/${new_slug}/" |
| fi |
| |