-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathprepare.sh
83 lines (66 loc) · 2.63 KB
/
prepare.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env bash
# https://docs.gitlab.com/runner/executors/custom.html#prepare
# shellcheck source=./include.sh
source "${BASH_SOURCE[0]%/*}/include.sh"
ensure_executable_available enroot
ensure_executable_available flock
ensure_executable_available grep
# Create CI WorkSpace paths if they don't exist
if [[ ! -d "${ENROOT_CACHE_PATH}" ]]; then
mkdir -p "${ENROOT_CACHE_PATH}"
fi
if [[ ! -d "${ENROOT_DATA_PATH}" ]]; then
mkdir -p "${ENROOT_DATA_PATH}"
fi
if [[ ! -d "${SLURM_IDS_PATH}" ]]; then
mkdir -p "${SLURM_IDS_PATH}"
fi
# Reuse a container if it exists
# shellcheck disable=SC2143
if ! [[ $(enroot list | grep "${CONTAINER_NAME}") ]]; then
echo -e "Preparing the container ${CONTAINER_NAME}."
# Check if CI job image: is set
if [[ -z "${CUSTOM_ENV_CI_JOB_IMAGE}" ]]; then
die "No CI job image specified"
fi
# Import a container image from a specific location to enroot image dir
# Scheme: docker://[USER@][REGISTRY#]IMAGE[:TAG]
IMAGE_DIR="${ENROOT_DATA_PATH}"
if [[ ${CUSTOM_ENV_CI_JOB_IMAGE} == "${CUSTOM_ENV_CI_REGISTRY}"* ]]; then
# shellcheck disable=SC2295
URL="docker://${CUSTOM_ENV_CI_REGISTRY_USER}:${CUSTOM_ENV_CI_REGISTRY_PASSWORD}@${CUSTOM_ENV_CI_REGISTRY}#${CUSTOM_ENV_CI_JOB_IMAGE#*$CUSTOM_ENV_CI_REGISTRY/}"
else
URL="docker://${CUSTOM_ENV_CI_JOB_IMAGE}"
fi
IMAGE_NAME="${CUSTOM_ENV_CI_JOB_IMAGE//[:@#.\/]/-}"
# Utility timestamp and lock files
IMAGE_TIMESTAMP_FILE=${IMAGE_DIR}/TIMESTAMP_${IMAGE_NAME}
IMAGE_LOCK_FILE=${IMAGE_DIR}/LOCK_${IMAGE_NAME}
# Update the image once every 3 hours. Use a lock to prevent conflicts
exec 100<>"${IMAGE_LOCK_FILE}"
flock -w 120 100
if [[ ! -f ${IMAGE_TIMESTAMP_FILE} ||
($(cat "${IMAGE_TIMESTAMP_FILE}") -le $(date +%s -d '-3 hours')) ]]; then
IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME}.sqsh"
if [[ -f ${IMAGE_FILE} ]]; then
rm "${IMAGE_DIR}/${IMAGE_NAME}.sqsh"
fi
COMMAND=(enroot import \
--output "${IMAGE_DIR}/${IMAGE_NAME}.sqsh" \
-- "${URL}")
"${COMMAND[@]}" || die "Command: ${COMMAND[*]} failed with exit code ${?}"
date +%s > "${IMAGE_TIMESTAMP_FILE}"
fi
flock -u 100
# Create a container root filesystem from a container image
COMMAND=(
enroot create \
--name "${CONTAINER_NAME}" \
-- "${IMAGE_DIR}/${IMAGE_NAME}.sqsh"
)
"${COMMAND[@]}" || die "Command: ${COMMAND[*]} failed with exit code ${?}"
else
echo -e "Reusing container ${CONTAINER_NAME}"
fi
# List all the container root filesystems on the system.
enroot list --fancy