3636ARTIFACTS=$( api " actions/runs/${RUN_ID} /artifacts?per_page=100" )
3737COUNT=$( echo " ${ARTIFACTS} " | jq ' .total_count' )
3838
39+ # Filter out expired artifacts
40+ VALID_ARTIFACTS=$( echo " ${ARTIFACTS} " | jq ' .artifacts | map(select(.expired == false))' )
41+ VALID_COUNT=$( echo " ${VALID_ARTIFACTS} " | jq ' length' )
42+
3943if [[ " ${COUNT} " -eq 0 ]]; then
4044 echo " No artifacts available for run ${RUN_ID} ." >&2
4145 exit 1
4246fi
4347
44- echo " Downloading ${COUNT} artifact(s) from run ${RUN_ID} ..."
48+ if [[ " ${VALID_COUNT} " -eq 0 ]]; then
49+ echo " All ${COUNT} artifact(s) from run ${RUN_ID} have expired." >&2
50+ exit 1
51+ fi
52+
53+ echo " Found ${VALID_COUNT} valid (non-expired) artifact(s) from run ${RUN_ID} (${COUNT} total)..."
4554
4655INDEX=0
56+ DOWNLOADED=0
4757while IFS= read -r artifact; do
4858 NAME=$( echo " ${artifact} " | jq -r ' .name' )
59+
60+ # Only download the merged screenshots artifact, skip individual shards and build
61+ if [[ " ${NAME} " =~ ^screenshots-[0-9]+$ ]]; then
62+ echo " Skipping shard artifact ${NAME} (merged artifact preferred)"
63+ continue
64+ fi
65+
66+ if [[ " ${NAME} " == " build" ]]; then
67+ echo " Skipping build artifact ${NAME} (not needed for references)"
68+ continue
69+ fi
70+
71+ echo " Processing artifact ${NAME} ..."
72+
4973 URL=$( echo " ${artifact} " | jq -r ' .archive_download_url' )
5074 if [[ -z " ${URL} " || " ${URL} " == " null" ]]; then
5175 echo " Skipping artifact ${NAME} with no download URL" >&2
@@ -54,23 +78,56 @@ while IFS= read -r artifact; do
5478
5579 TMP_ZIP=" $( mktemp) "
5680 TMP_DIR=" $( mktemp -d) "
57- curl -sSL -H " Authorization: Bearer ${TOKEN} " -H " Accept: application/vnd.github+json" " ${URL} " -o " ${TMP_ZIP} "
81+
82+ echo " Downloading ${NAME} from ${URL} ..."
83+ if ! curl -fsSL -H " Authorization: Bearer ${TOKEN} " -H " Accept: application/vnd.github+json" " ${URL} " -o " ${TMP_ZIP} " ; then
84+ echo " Failed to download artifact ${NAME} " >&2
85+ rm -rf " ${TMP_ZIP} " " ${TMP_DIR} "
86+ continue
87+ fi
88+
89+ # Verify the download produced a valid zip file
90+ if [[ ! -s " ${TMP_ZIP} " ]]; then
91+ echo " Downloaded file is empty for artifact ${NAME} " >&2
92+ rm -rf " ${TMP_ZIP} " " ${TMP_DIR} "
93+ continue
94+ fi
95+
96+ if ! unzip -tq " ${TMP_ZIP} " > /dev/null 2>&1 ; then
97+ echo " Downloaded file is not a valid zip for artifact ${NAME} " >&2
98+ rm -rf " ${TMP_ZIP} " " ${TMP_DIR} "
99+ continue
100+ fi
101+
58102 unzip -oq " ${TMP_ZIP} " -d " ${TMP_DIR} "
59103
60104 if [[ -d " ${TMP_DIR} /screenshots" ]]; then
105+ # Artifact contains a screenshots/ subdirectory - extract its contents
61106 shopt -s dotglob
62107 mkdir -p " ${TARGET_DIR} "
63108 cp -R " ${TMP_DIR} /screenshots" /* " ${TARGET_DIR} /" 2> /dev/null || true
64109 shopt -u dotglob
110+ elif [[ " ${NAME} " == " screenshots" ]]; then
111+ # Merged screenshots artifact extracts directly to target
112+ shopt -s dotglob
113+ mkdir -p " ${TARGET_DIR} "
114+ cp -R " ${TMP_DIR} " /* " ${TARGET_DIR} /" 2> /dev/null || true
115+ shopt -u dotglob
65116 else
117+ # Other artifacts go to subdirectories
66118 DEST_DIR=" ${TARGET_DIR} /${NAME} "
67119 mkdir -p " ${DEST_DIR} "
68120 cp -R " ${TMP_DIR} " /* " ${DEST_DIR} /" 2> /dev/null || true
69121 fi
70122
71123 rm -rf " ${TMP_ZIP} " " ${TMP_DIR} "
72- INDEX=$(( INDEX + 1 ))
73- echo " Downloaded artifact ${NAME} "
74- done < <( echo " ${ARTIFACTS} " | jq -c ' .artifacts[]' )
124+ DOWNLOADED=$(( DOWNLOADED + 1 ))
125+ echo " Successfully downloaded artifact ${NAME} "
126+ done < <( echo " ${VALID_ARTIFACTS} " | jq -c ' .[]' )
127+
128+ if [[ " ${DOWNLOADED} " -eq 0 ]]; then
129+ echo " No artifacts were downloaded successfully" >&2
130+ exit 1
131+ fi
75132
76- echo " Downloaded ${INDEX } artifact(s) to ${TARGET_DIR} " .
133+ echo " Successfully downloaded ${DOWNLOADED } artifact(s) to ${TARGET_DIR} "
0 commit comments