11#! /bin/bash
22set -euo pipefail
3- set -ex
43
54# #######################################################################
65#
76# Launch a Skymap Scanner worker
7+ # Uses '_CI_SCANNER_CONTAINER_PLATFORM' to control the mode:
88#
9- # Run worker on ewms pilot
9+ # - Docker mode:
10+ # runs the pilot image (docker) that runs Docker scanner clients
11+ # - Apptainer mode:
12+ # runs the pilot image (docker) that runs Apptainer scanner clients
1013#
1114# #######################################################################
1215
16+ # #######################################################################
17+ # Common (platform-agnostic) setup
18+ # #######################################################################
19+
1320# establish pilot's root path
1421tmp_rootdir=" $( pwd) /pilot-$( uuidgen) "
15- mkdir $tmp_rootdir
16- cd $tmp_rootdir
22+ mkdir " $tmp_rootdir "
23+ cd " $tmp_rootdir "
1724export EWMS_PILOT_DATA_DIR_PARENT_PATH_ON_HOST=" $tmp_rootdir "
1825
1926# mark startup.json's dir to be bind-mounted into the task container (by the pilot)
2027# -> check that the dir only has one file, otherwise we may end up binding extra dirs
2128python -c ' import os; assert os.listdir(os.path.dirname(os.environ["CI_SKYSCAN_STARTUP_JSON"])) == ["startup.json"]'
2229export EWMS_PILOT_EXTERNAL_DIRECTORIES=" $( dirname " $CI_SKYSCAN_STARTUP_JSON " ) "
2330
24- # task image, args, env
25- if [ -n " ${_RUN_THIS_SIF_IMAGE:- } " ]; then
26- # place a duplicate of the file b/c the pilot transforms this into another format, so there are issues w/ parallelizing
27- export EWMS_PILOT_TASK_IMAGE=" $tmp_rootdir /$( basename " $_RUN_THIS_SIF_IMAGE " ) "
28- cp " $_RUN_THIS_SIF_IMAGE " " $EWMS_PILOT_TASK_IMAGE "
29- export _EWMS_PILOT_CONTAINER_PLATFORM=" apptainer"
30- else
31- export EWMS_PILOT_TASK_IMAGE=" $CI_DOCKER_IMAGE_TAG "
32- export _EWMS_PILOT_CONTAINER_PLATFORM=" docker" # NOTE: technically not needed b/c this is the default value
33- export _EWMS_PILOT_DOCKER_SHM_SIZE=" 6gb" # this only needed in ci--the infra would set this in prod
34- fi
31+ # args
3532export EWMS_PILOT_TASK_ARGS=" python -m skymap_scanner.client --infile {{INFILE}} --outfile {{OUTFILE}} --client-startup-json $CI_SKYSCAN_STARTUP_JSON "
36- json_var=$( env | grep -E ' ^(SKYSCAN_|_SKYSCAN_)' | awk -F= ' {printf "\"%s\":\"%s\",", $1, $2}' | sed ' s/,$//' ) # must remove last comma
33+
34+ # marshal SKYSCAN/_SKYSCAN_ env into JSON
35+ json_var=$( env | grep -E ' ^(SKYSCAN_|_SKYSCAN_)' | awk -F= ' {printf "\"%s\":\"%s\",", $1, $2}' | sed ' s/,$//' )
3736json_var=" {$json_var }"
3837export EWMS_PILOT_TASK_ENV_JSON=" $json_var "
3938
40- # file types -- controls intermittent serialization
39+ # file types
4140export EWMS_PILOT_INFILE_EXT=" JSON"
4241export EWMS_PILOT_OUTFILE_EXT=" JSON"
4342
44- # Load JSON values
43+ # queues/broker config
4544export EWMS_PILOT_QUEUE_INCOMING=$( jq -r ' .toclient.name' " $_EWMS_JSON_ON_HOST " )
4645export EWMS_PILOT_QUEUE_INCOMING_AUTH_TOKEN=$( jq -r ' .toclient.auth_token' " $_EWMS_JSON_ON_HOST " )
4746export EWMS_PILOT_QUEUE_INCOMING_BROKER_TYPE=$( jq -r ' .toclient.broker_type' " $_EWMS_JSON_ON_HOST " )
@@ -53,11 +52,62 @@ export EWMS_PILOT_QUEUE_OUTGOING_BROKER_TYPE=$(jq -r '.fromclient.broker_type' "
5352export EWMS_PILOT_QUEUE_OUTGOING_BROKER_ADDRESS=$( jq -r ' .fromclient.broker_address' " $_EWMS_JSON_ON_HOST " )
5453
5554
56- # run!
57- ENV=" $( dirname $tmp_rootdir ) /pyenv-$( basename $tmp_rootdir ) "
58- pip install virtualenv
59- virtualenv --python python3 " $ENV "
60- . " $ENV " /bin/activate
61- pip install --upgrade pip
62- pip install ewms-pilot[rabbitmq]
63- python -m ewms_pilot
55+ # #######################################################################
56+ # Run!
57+ # #######################################################################
58+
59+ # ─────────────── Case: Docker ───────────────
60+ if [[ " ${_CI_SCANNER_CONTAINER_PLATFORM} " == " docker" ]]; then
61+
62+ # docker-specific pilot env vars
63+ export EWMS_PILOT_TASK_IMAGE=" $_SCANNER_IMAGE_DOCKER "
64+ export _EWMS_PILOT_DOCKER_SHM_SIZE=" 6gb" # CI-specific; prod infra should set this
65+
66+ # Required env for the helper
67+ export DOOD_OUTER_IMAGE=" $_PILOT_IMAGE_FOR_DOCKER_SCANNER_CLIENT "
68+ # Network for the outer container
69+ if [[ -z " ${DOOD_NETWORK:- } " ]]; then
70+ echo " ::error::DOOD_NETWORK must be set — this should've been set in '.github/workflows/tests.yml'. Did it not get forwarded to this script?"
71+ exit 1
72+ fi
73+ # Bind dirs: the pilot needs these paths visible at the same locations
74+ # - tmp_rootdir (RW)
75+ # - startup.json's parent (RO)
76+ export DOOD_BIND_RW_DIRS=" $tmp_rootdir "
77+ export DOOD_BIND_RO_DIRS=" $( dirname " $CI_SKYSCAN_STARTUP_JSON " ) "
78+ # Forward envs by prefix and explicit list
79+ export DOOD_FORWARD_ENV_PREFIXES=" EWMS_ _EWMS_ SKYSCAN_ _SKYSCAN_"
80+ export DOOD_FORWARD_ENV_VARS=" CI_SKYSCAN_STARTUP_JSON"
81+
82+ # run (curl script first)
83+ tmp_for_dood_sh=$( mktemp -d)
84+ curl -fsSL " $CI_SCRIPT_URL_DOOD_RUN " -o " $tmp_for_dood_sh /run-dood.sh"
85+ chmod +x " $tmp_for_dood_sh /run-dood.sh"
86+ " $tmp_for_dood_sh /run-dood.sh"
87+
88+ # ─────────────── Case: Apptainer ───────────────
89+ elif [[ " ${_CI_SCANNER_CONTAINER_PLATFORM} " == " apptainer" ]]; then
90+
91+ # apptainer-specific pilot env vars
92+ export EWMS_PILOT_TASK_IMAGE=" $_SCANNER_IMAGE_APPTAINER "
93+ export _EWMS_PILOT_APPTAINER_IMAGE_DIRECTORY_MUST_BE_PRESENT=True
94+
95+ # run
96+ docker run --rm \
97+ --privileged \
98+ --network=host \
99+ \
100+ -v " $tmp_rootdir :$tmp_rootdir " \
101+ -v " $( dirname " $CI_SKYSCAN_STARTUP_JSON " ) :$( dirname " $CI_SKYSCAN_STARTUP_JSON " ) " :ro \
102+ -v " $_SCANNER_IMAGE_APPTAINER :$_SCANNER_IMAGE_APPTAINER " :ro \
103+ \
104+ --env CI_SKYSCAN_STARTUP_JSON=" $CI_SKYSCAN_STARTUP_JSON " \
105+ $( env | grep -E ' ^(EWMS_|_EWMS_)' | cut -d' =' -f1 | sed ' s/^/--env /' ) \
106+ \
107+ " $_PILOT_IMAGE_FOR_APPTAINER_SCANNER_CLIENT "
108+
109+ # ─────────────── Case: Unknown??? ───────────────
110+ else
111+ echo " ::error::cannot launch worker — unknown '_CI_SCANNER_CONTAINER_PLATFORM=$_CI_SCANNER_CONTAINER_PLATFORM '"
112+ exit 2
113+ fi
0 commit comments