mirror of https://github.com/containers/podman.git
164 lines
4.5 KiB
Bash
Executable File
164 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# get-local-registry-script - fetches local-registry script from automation_images repo
|
|
#
|
|
ME=$(basename $0)
|
|
|
|
###############################################################################
|
|
# BEGIN global settings
|
|
|
|
SCRIPTNAME=cache_images/local-cache-registry
|
|
|
|
REPO=containers/automation_images
|
|
|
|
GITHUB_GRAPHQL=https://api.github.com/graphql
|
|
|
|
# END global settings
|
|
###############################################################################
|
|
|
|
usage="Usage: $ME [--help] [-v|--verbose] [IMG_SFX]
|
|
|
|
--help display usage message
|
|
-v, --verbose verbose output
|
|
|
|
$ME fetches the $SCRIPTNAME tool
|
|
from the github $REPO repo.
|
|
If successful, the script will be left in cwd.
|
|
|
|
It is up to you to invoke it:
|
|
|
|
\$ sudo ./$(basename $SCRIPTNAME) initialize
|
|
|
|
This will set up a local registry and prepopulate it with
|
|
images used in tests. Initialization may take tens of minutes
|
|
on a slow connection.
|
|
|
|
To use this registry in e2e or apiv2 tests:
|
|
|
|
export CI_USE_REGISTRY_CACHE=1
|
|
|
|
To use in system tests, you need to overwrite /etc/containers/registries.conf
|
|
because system tests, by definition, use system settings. This is left as
|
|
an exercise for the reader.
|
|
|
|
Reasons for doing this:
|
|
1) Consistency with CI environment
|
|
2) Speedier (and less flaky) tests
|
|
"
|
|
|
|
verbose=
|
|
for i; do
|
|
value=`expr "$i" : '[^=]*=\(.*\)'`
|
|
case "$i" in
|
|
-h*|--help) echo "$usage"; exit 0;;
|
|
-v|--verbose) verbose=$i; shift;;
|
|
-*) echo "$ME: unrecognized option $i" >&2
|
|
echo "$usage" >&2
|
|
exit 1;;
|
|
*) break;;
|
|
esac
|
|
done
|
|
|
|
###############################################################################
|
|
# BEGIN helper functions
|
|
|
|
function die() {
|
|
echo "$ME: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
function get_imgsfx() {
|
|
test -e .cirrus.yml || die ".cirrus.yml does not exist; please run me from top of repo"
|
|
|
|
imgsfx=$(sed -ne 's/^ *IMAGE_SUFFIX:.*"c\(202.*\)"/\1/p' <.cirrus.yml)
|
|
if [[ -z "$imgsfx" ]]; then
|
|
die "Did not find 'IMAGE_SUFFIX:.*c202.*' in .cirrus.yml"
|
|
fi
|
|
|
|
expr "$imgsfx" : "^20[0-9]\{6\}t[0-9]\{6\}z-" &> /dev/null || die "IMAGE_SUFFIX '$imgsfx' (from .cirrus.yml) does not match expected YYYYMMDDtHHMMSS-* form"
|
|
|
|
echo $imgsfx
|
|
}
|
|
|
|
function get_script() {
|
|
local tag=$1
|
|
|
|
local tmpfile=$(mktemp --tmpdir --suffix=.sh $ME.fetched-script.XXXXXXX)
|
|
|
|
local url="https://raw.githubusercontent.com/${REPO}/$tag/$SCRIPTNAME"
|
|
test -n "$verbose" && echo "[ $url ]" >&2
|
|
|
|
curl -s -f -o $tmpfile $url
|
|
if [[ $? -eq 0 ]]; then
|
|
chmod 755 $tmpfile
|
|
mv -f $tmpfile $SCRIPTNAME
|
|
echo $SCRIPTNAME
|
|
return
|
|
fi
|
|
rm -f $tmpfile
|
|
}
|
|
|
|
# END helper functions
|
|
###############################################################################
|
|
# BEGIN code
|
|
|
|
if [[ -n "$1" ]]; then
|
|
imgsfx=$1
|
|
shift
|
|
if [[ -n "$*" ]]; then
|
|
die "Too many arguments; run $ME --help for help"
|
|
fi
|
|
else
|
|
imgsfx=$(get_imgsfx)
|
|
fi
|
|
test -n "$verbose" && echo "[ imgsfx=$imgsfx ]" >&2
|
|
|
|
# Easy case: this is a tagged automation_images build
|
|
fetched_script=$(get_script $imgsfx)
|
|
if [[ -n "$fetched_script" ]]; then
|
|
echo $fetched_script
|
|
exit 0
|
|
fi
|
|
|
|
# Nope, not a tagged build. Look for imgsfx in PR
|
|
query="
|
|
{
|
|
\"query\": \"{
|
|
search(query: \\\"repo:$REPO is:pr c$imgsfx\\\", type:ISSUE, first:10) {
|
|
edges {
|
|
node { ... on PullRequest {
|
|
number
|
|
title
|
|
commits(last:30) { nodes { commit { committedDate, oid } } }
|
|
comments(last:30) { nodes { createdAt author { login } body } }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}\"
|
|
}
|
|
"
|
|
|
|
query_clean=$(tr -d \\012 <<<"$query")
|
|
|
|
jsontmp=$(mktemp --tmpdir --suffix=.json $ME.graphql.XXXXXXX)
|
|
|
|
curl -s -S -H "Authorization: bearer $GITHUB_TOKEN" -X POST --data "$query_clean" $GITHUB_GRAPHQL > $jsontmp
|
|
|
|
# There should be one and exactly one comment from github-actions
|
|
# that mentions the given imgsfx. Find its timestamp
|
|
img_timestamp=$(jq -C -r '.data.search.edges.[].node.comments.nodes.[] | select(.author.login="github-actions") | select(.body | contains("c'${imgsfx}'")).createdAt' < $jsontmp)
|
|
if [[ -z "$img_timestamp" ]]; then
|
|
die "Did not find a github-actions comment mentioning '$imgsfx'"
|
|
fi
|
|
|
|
# Some time prior to that comment, there was a commit pushed to github
|
|
# that resulted in that build. Find that commit's SHA (OID).
|
|
push_sha=$(jq -C -r '.data.search.edges.[].node.commits.nodes.[].commit | select(.committedDate < "'${img_timestamp}'").oid' < $jsontmp)
|
|
|
|
# Got all the info we need. Clean up tmpfile
|
|
rm -f $jsontmp
|
|
|
|
# This must succeed.
|
|
get_script $push_sha
|