Skip to content

Commit 66ae90a

Browse files
authored
feat: use master tracks for tag and copy to production track (IN-3005) (#359)
## Description Use the `master` tracks as the source of truth on the latest tag for a service. use the `tag` field to update `latest-production` tag, and copy the full track file to `production` track
1 parent c540d46 commit 66ae90a

1 file changed

Lines changed: 51 additions & 77 deletions

File tree

Lines changed: 51 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,95 @@
11
#!/bin/bash
2+
set -eE
23

3-
echo "COMPONENT_NAMES: ${COMPONENT_NAMES[*]}"
4+
BUCKET="com.voiceflow.ci.assets"
5+
6+
echo "IMAGE_REGISTRY=${IMAGE_REGISTRY}"
7+
echo "BUCKET=${BUCKET}"
48

5-
IMAGE_TAG="latest-master"
69
< <(echo "$COMPONENT_NAMES") read -r -a COMPONENT_NAMES
10+
echo "COMPONENT_NAMES: ${COMPONENT_NAMES[*]}"
711

8-
RESULT=0
9-
DIGESTS=()
10-
DEBUG_LOG_FILE="/tmp/promote-production.err"
12+
TMP_DIR="$(mktemp -d)"
1113

12-
get_digest() {
13-
local SERVICE
14-
local IMAGE_NAME
15-
local DIGEST
14+
get_master_tracks() {
15+
local DIR
16+
local TRACK_PATH
1617

17-
SERVICE="${1?}"
18-
IMAGE_NAME="${IMAGE_REGISTRY}/${SERVICE}:${IMAGE_TAG}"
19-
printf "Check existence of %s..." "${IMAGE_NAME}" >&2
20-
DIGEST=$(crane digest "${IMAGE_NAME}" 2>&3)
21-
RESULT="$?"
22-
if ((RESULT)); then
23-
printf "fail\n" >&2
24-
return 1
25-
else
26-
printf "success\n" >&2
27-
echo "$DIGEST"
28-
fi
29-
}
18+
DIR="${1?}"
19+
shift 1
20+
21+
echo "Fetching tracks to ${DIR}..."
3022

31-
check_exists() {
32-
local NAME
33-
local DIGEST
23+
for COMPONENT in "$@"; do
24+
TRACK_PATH="tracks/${COMPONENT}/master"
3425

35-
DIGESTS=()
26+
echo " $COMPONENT..."
3627

37-
exec 3<>"${DEBUG_LOG_FILE?}"
28+
mkdir -p "$(dirname "${DIR}/${TRACK_PATH}")"
3829

39-
set +e
40-
for i in "${!COMPONENT_NAMES[@]}"; do
41-
NAME="${COMPONENT_NAMES[$i]}"
42-
DIGEST=$(get_digest "${NAME}")
43-
RESULT=$((RESULT + $?))
44-
DIGESTS+=("$DIGEST")
30+
aws s3 cp --no-progress "s3://${BUCKET}/${TRACK_PATH}" "${DIR}/${TRACK_PATH}"
4531
done
46-
set -e
32+
}
4733

48-
exec 3>&-
34+
parse_tag() {
35+
local DIR
36+
local COMPONENT
37+
local TRACK_PATH_ABSOLUTE
38+
39+
DIR="${1?}"
40+
COMPONENT="${2?}"
4941

50-
if ((RESULT)); then
51-
echo "ERROR: Failed to find all image tags" >&2
52-
cat "${DEBUG_LOG_FILE?}"
53-
exit 1
42+
TRACK_PATH_ABSOLUTE="${DIR}/tracks/${COMPONENT}/master"
43+
44+
if [[ "${COMPONENT}" == "database-cli" ]]; then
45+
# The full contents of database-cli track is the image tag
46+
cat "${TRACK_PATH_ABSOLUTE}"
47+
else
48+
yq -r ".[\"$COMPONENT\"].image.tag" "${TRACK_PATH_ABSOLUTE}"
5449
fi
5550
}
5651

5752
add_production_tags() {
5853
local SERVICE
54+
local IMAGE_TAG
5955
local IMAGE_NAME
6056

6157
SERVICE="${1?}"
58+
IMAGE_TAG="${2?}"
59+
6260
IMAGE_NAME="${IMAGE_REGISTRY}/${SERVICE}:${IMAGE_TAG}"
6361

6462
crane tag "${IMAGE_NAME}" "latest-production"
65-
crane tag "${IMAGE_NAME}" "k8s-production-${CIRCLE_SHA1}"
6663

6764
if [[ "$SERVICE" = "database-cli" ]]; then
6865
crane tag "${IMAGE_NAME}" "latest"
6966
fi
7067
}
7168

72-
update_track() {
69+
copy_track() {
70+
local DIR
7371
local COMPONENT
74-
local IMAGE_DIGEST
75-
local TRACK_PATH
76-
local BUCKET
77-
local TRACK
78-
BUCKET="com.voiceflow.ci.assets"
72+
local MASTER_TRACK
73+
local PRODUCTION_TRACK
7974

80-
COMPONENT="${1?}"
81-
IMAGE_DIGEST="${2?}"
82-
TRACK="${CIRCLE_BRANCH}"
83-
84-
if [[ -z "${CIRCLE_BRANCH}" && -n "${CIRCLE_TAG}" ]]; then
85-
TRACK="production"
86-
fi
87-
88-
TRACK_PATH="tracks/${COMPONENT}/${TRACK}"
75+
DIR="${1?}"
76+
COMPONENT="${2?}"
8977

9078
### update the track
91-
echo "TRACK_PATH: ${TRACK_PATH}"
92-
93-
mkdir -p "$(dirname "/tmp/${TRACK_PATH}")"
94-
95-
if [[ "$COMPONENT" = "database-cli" ]]; then
96-
echo "New version published: ${IMAGE_TAG}"
97-
echo "${IMAGE_TAG}" >"/tmp/${TRACK_PATH}"
98-
else
99-
cat <<EOF >"/tmp/${TRACK_PATH}"
100-
${COMPONENT}:
101-
image:
102-
tag: ${IMAGE_TAG}
103-
sha: ${IMAGE_DIGEST#sha256:}
104-
EOF
105-
fi
106-
aws s3 cp "/tmp/${TRACK_PATH}" "s3://${BUCKET}/${TRACK_PATH}"
79+
MASTER_TRACK="${DIR}/tracks/${COMPONENT}/master"
80+
PRODUCTION_TRACK="tracks/${COMPONENT}/production"
81+
echo "Copying ${COMPONENT} master track from ${DIR} to production..."
82+
aws s3 cp --no-progress "${MASTER_TRACK}" "s3://${BUCKET}/${PRODUCTION_TRACK}"
10783
}
10884

109-
check_exists
85+
get_master_tracks "${TMP_DIR}" "${COMPONENT_NAMES[@]}"
11086

111-
echo "All tags exist"
11287
echo "Adding production tag and updating tracks for..."
11388

11489
for INDEX in "${!COMPONENT_NAMES[@]}"; do
11590
NAME="${COMPONENT_NAMES[$INDEX]}"
116-
DIGEST="${DIGESTS[$INDEX]}"
91+
TAG="$(parse_tag "$TMP_DIR" "${NAME}")"
11792

118-
echo "${NAME}:${DIGEST}"
119-
add_production_tags "${NAME}"
120-
update_track "${NAME}" "${DIGEST}"
93+
add_production_tags "${NAME}" "${TAG}"
94+
copy_track "${TMP_DIR}" "${NAME}"
12195
done

0 commit comments

Comments
 (0)