Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 1 | #!/bin/bash |
Paul Sokolovsky | 98b6689 | 2024-11-28 18:47:41 +0700 | [diff] [blame] | 2 | set -x |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 3 | |
| 4 | echo "########################################################################" |
| 5 | echo " Gerrit Environment" |
Paul Sokolovsky | d7c1800 | 2024-11-28 14:57:32 +0700 | [diff] [blame] | 6 | env | grep '^GERRIT' |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 7 | echo "########################################################################" |
| 8 | |
Paul Sokolovsky | 98b6689 | 2024-11-28 18:47:41 +0700 | [diff] [blame] | 9 | set -e |
| 10 | |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 11 | if [ "${GERRIT_PROJECT}" == "TF-A/trusted-firmware-a" ]; then |
| 12 | # For real production project, non-sandbox run goes to production RTD project, |
| 13 | # while for sandbox run to a separate RTD project. |
| 14 | if [ "${SANDBOX_RUN}" == "false" ]; then |
Paul Sokolovsky | fb2d040 | 2024-03-04 20:20:55 +0700 | [diff] [blame] | 15 | RTD_PROJECT="trustedfirmware-a" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 16 | RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/trustedfirmware-a/87181/" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 17 | RTD_WEBHOOK_SECRET_KEY=${RTD_WEBHOOK_SECRET} |
| 18 | RTD_API_TOKEN=${RTD_API_TOKEN} |
| 19 | else |
Paul Sokolovsky | fb2d040 | 2024-03-04 20:20:55 +0700 | [diff] [blame] | 20 | RTD_PROJECT="trustedfirmware-a-sandbox" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 21 | RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/trustedfirmware-a-sandbox/263958/" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 22 | RTD_WEBHOOK_SECRET_KEY=${TFA_SANDBOX_RTD_WEBHOOK_SECRET} |
| 23 | RTD_API_TOKEN=${PFALCON_RTD_API_TOKEN} |
| 24 | fi |
| 25 | elif [ "${GERRIT_PROJECT}" == "sandbox/pfalcon/trusted-firmware-a" ]; then |
| 26 | # For test project, both "production" and "sandbox" go to the same elsewhere project. |
Paul Sokolovsky | fb2d040 | 2024-03-04 20:20:55 +0700 | [diff] [blame] | 27 | RTD_PROJECT="pfalcon-trustedfirmware-a-sandbox" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 28 | RTD_WEBHOOK_URL="https://readthedocs.org/api/v2/webhook/pfalcon-trustedfirmware-a-sandbox/263459/" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 29 | RTD_WEBHOOK_SECRET_KEY=${PFALCON_RTD_WEBHOOK_SECRET} |
| 30 | RTD_API_TOKEN=${PFALCON_RTD_API_TOKEN} |
| 31 | else |
| 32 | echo "Unknown GERRIT_PROJECT: ${GERRIT_PROJECT}" |
| 33 | exit 1 |
| 34 | fi |
| 35 | |
Paul Sokolovsky | fb2d040 | 2024-03-04 20:20:55 +0700 | [diff] [blame] | 36 | RTD_API="https://readthedocs.org/api/v3/projects/${RTD_PROJECT}" |
Paul Sokolovsky | 6338f10 | 2024-03-01 16:26:15 +0700 | [diff] [blame] | 37 | RTD_VER_API="${RTD_API}/versions" |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 38 | |
| 39 | new_tag="" |
Paul Sokolovsky | 3cc0023 | 2024-03-04 20:43:23 +0700 | [diff] [blame] | 40 | new_slug="" |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 41 | refname=${GERRIT_REFNAME##*/} |
| 42 | lts_branch=${refname} |
Paul Sokolovsky | 07bd095 | 2024-03-01 16:14:14 +0700 | [diff] [blame] | 43 | if echo ${GERRIT_REFNAME} | grep -q "refs/tags/"; then |
| 44 | new_tag=${GERRIT_REFNAME#refs/tags/} |
Paul Sokolovsky | 3cc0023 | 2024-03-04 20:43:23 +0700 | [diff] [blame] | 45 | # Convert tag to ReadTheDocs version slug |
| 46 | new_slug=$(echo ${new_tag} | tr '[A-Z]/' '[a-z]-') |
Paul Sokolovsky | 07bd095 | 2024-03-01 16:14:14 +0700 | [diff] [blame] | 47 | lts_branch=${refname%.*} |
| 48 | fi |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 49 | |
Paul Sokolovsky | 98b6689 | 2024-11-28 18:47:41 +0700 | [diff] [blame] | 50 | function rtd_rest_api() { |
| 51 | uri="$1" |
| 52 | jqfilt="$2" |
| 53 | resp=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" "$uri") |
| 54 | echo $resp 1>&2 |
| 55 | echo $resp | jq -r "$jqfilt" |
| 56 | } |
| 57 | |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 58 | function activate_version() { |
| 59 | version=$1 |
Arthur She | c4b4b5e | 2024-02-09 21:28:27 -0800 | [diff] [blame] | 60 | max_retry_time=20 |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 61 | retry=0 |
| 62 | |
Arthur She | 0f2a83e | 2025-03-20 09:28:31 +0800 | [diff] [blame] | 63 | # Check whether we need to activate a tag or a branch. If it's a tag, create a branch variable |
| 64 | echo ${version} | grep -q "lts-v[0-9].*\.[0-9].*\.[0-9].*" && branch=${version%.*} |
| 65 | |
Arthur She | 9eb302e | 2024-04-09 21:50:20 -0700 | [diff] [blame] | 66 | ver_slug=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${version}/ | \ |
| 67 | jq -r '.slug') |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 68 | |
Arthur She | 9eb302e | 2024-04-09 21:50:20 -0700 | [diff] [blame] | 69 | while [ "${ver_slug}" != "${version}" ]; |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 70 | do |
Arthur She | c4b4b5e | 2024-02-09 21:28:27 -0800 | [diff] [blame] | 71 | [ ${retry} -gt ${max_retry_time} ] && break |
| 72 | sleep 30 |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 73 | retry=$((retry+1)) |
Arthur She | 9eb302e | 2024-04-09 21:50:20 -0700 | [diff] [blame] | 74 | ver_slug=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${version}/ | \ |
| 75 | jq -r '.slug') |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 76 | done |
Arthur She | c4b4b5e | 2024-02-09 21:28:27 -0800 | [diff] [blame] | 77 | |
Arthur She | 0f2a83e | 2025-03-20 09:28:31 +0800 | [diff] [blame] | 78 | # activate and hide the branch |
| 79 | if [ -n "${branch}" ]; then |
| 80 | curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
| 81 | -d "{\"active\": true, \"hidden\": true}" ${RTD_VER_API}/${branch}/ |
| 82 | fi |
| 83 | |
Arthur She | c4b4b5e | 2024-02-09 21:28:27 -0800 | [diff] [blame] | 84 | if [ ${retry} -le ${max_retry_time} ]; then |
| 85 | echo "Active new version: ${version}" |
| 86 | curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
| 87 | -d "{\"active\": true, \"hidden\": false}" ${RTD_VER_API}/${version}/ |
| 88 | else |
| 89 | echo "RTD can not find the version: ${version}" |
| 90 | exit 1 |
| 91 | fi |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 92 | } |
| 93 | |
Paul Sokolovsky | f1f6893 | 2024-03-01 16:37:41 +0700 | [diff] [blame] | 94 | function wait_for_build() { |
| 95 | version=$1 |
Paul Sokolovsky | 2cac9b8 | 2024-03-18 15:17:08 +0700 | [diff] [blame] | 96 | retry=0 |
Paul Sokolovsky | f1f6893 | 2024-03-01 16:37:41 +0700 | [diff] [blame] | 97 | while true; do |
| 98 | status=$(curl -s -H "Authorization: Token ${RTD_API_TOKEN}" "${RTD_API}/builds/" | \ |
| 99 | jq -r ".results | map(select(.version==\"$version\")) | .[0].state.code") |
| 100 | echo $status |
| 101 | if [ "$status" == "finished" ]; then |
| 102 | break |
| 103 | fi |
Paul Sokolovsky | 2cac9b8 | 2024-03-18 15:17:08 +0700 | [diff] [blame] | 104 | |
| 105 | retry=$((retry + 1)) |
| 106 | if [ $retry -gt 40 ]; then |
| 107 | echo "Could not confirm that ReadTheDoc slug ${version} was built in the alloted time." |
| 108 | break |
| 109 | fi |
| 110 | |
Paul Sokolovsky | ae61e3e | 2024-03-18 19:45:10 +0700 | [diff] [blame] | 111 | sleep 30 |
Paul Sokolovsky | f1f6893 | 2024-03-01 16:37:41 +0700 | [diff] [blame] | 112 | done |
| 113 | } |
| 114 | |
Arthur She | 61a4ef9 | 2025-01-29 07:06:37 -0800 | [diff] [blame] | 115 | echo "Notifying ReadTheDocs of changes" |
Arthur She | 0f2a83e | 2025-03-20 09:28:31 +0800 | [diff] [blame] | 116 | curl -s -X POST -H "Authorization: Token ${RTD_API_TOKEN}" ${RTD_VER_API}/${lts_branch}/builds/ |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 117 | |
| 118 | # Triggered by a new tag |
| 119 | if [ -n "${new_tag}" ]; then |
Paul Sokolovsky | 3cc0023 | 2024-03-04 20:43:23 +0700 | [diff] [blame] | 120 | echo -e "\nNew release tag: ${new_tag}, slug: ${new_slug}" |
Arthur She | 61a4ef9 | 2025-01-29 07:06:37 -0800 | [diff] [blame] | 121 | # Hide the current active and visible version |
Paul Sokolovsky | 98b6689 | 2024-11-28 18:47:41 +0700 | [diff] [blame] | 122 | old_tags=$(rtd_rest_api "${RTD_VER_API}/?slug=${lts_branch}&type=tag&active=true" '.results | map(select(.hidden == false) | .slug) | .[]') |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 123 | for t in ${old_tags}; |
| 124 | do |
Arthur She | 61a4ef9 | 2025-01-29 07:06:37 -0800 | [diff] [blame] | 125 | echo "Hide old version: ${t}" |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 126 | curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${RTD_API_TOKEN}" \ |
Paul Sokolovsky | 92151ad | 2024-02-26 12:38:32 +0700 | [diff] [blame] | 127 | -d "{\"hidden\": true}" ${RTD_VER_API}/${t}/ |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 128 | done |
| 129 | # Active the new version |
Paul Sokolovsky | 3cc0023 | 2024-03-04 20:43:23 +0700 | [diff] [blame] | 130 | echo "Active new version: ${new_slug}" |
| 131 | activate_version ${new_slug} |
Paul Sokolovsky | af1e540 | 2024-03-17 18:08:43 +0700 | [diff] [blame] | 132 | |
| 133 | wait_for_build ${new_slug} |
| 134 | echo "Docs for the new release are available at: https://${RTD_PROJECT}.readthedocs.io/en/${new_slug}/" |
Arthur She | 8c3dac2 | 2024-01-15 20:13:40 -0800 | [diff] [blame] | 135 | fi |
| 136 | |