4646export homedir
4747
4848# Set common paths
49- B=/usr/local/bin
50- V=/var/run/github-runner
49+ BIN_DIR=/usr/local/bin
50+ RUNNER_STATE_DIR=/var/run/github-runner
51+ mkdir -p $RUNNER_STATE_DIR
5152
5253# Fetch shared functions from GitHub
5354echo " [$( date ' +%Y-%m-%d %H:%M:%S' ) ] Fetching shared functions from GitHub (SHA: ${action_sha} )" | tee -a /var/log/runner-setup.log
@@ -59,7 +60,7 @@ if ! curl -sSL "$FUNCTIONS_URL" -o /tmp/shared-functions.sh && ! wget -q "$FUNCT
5960fi
6061
6162# Write shared functions that will be used by multiple scripts
62- cat > $B /runner-common.sh << EOSF
63+ cat > $BIN_DIR /runner-common.sh << EOSF
6364# Auto-generated shared functions and variables
6465# Set homedir for scripts that source this file
6566homedir="$homedir "
@@ -69,34 +70,34 @@ export homedir debug
6970EOSF
7071
7172# Append the downloaded shared functions
72- cat /tmp/shared-functions.sh >> $B /runner-common.sh
73+ cat /tmp/shared-functions.sh >> $BIN_DIR /runner-common.sh
7374
74- chmod +x $B /runner-common.sh
75- source $B /runner-common.sh
75+ chmod +x $BIN_DIR /runner-common.sh
76+ source $BIN_DIR /runner-common.sh
7677
7778logger " EC2-GHA: Starting userdata script"
7879trap ' logger "EC2-GHA: Script failed at line $LINENO with exit code $?"' ERR
7980trap ' terminate_instance "Setup script failed with error on line $LINENO"' ERR
8081# Handle watchdog termination signal
81- trap ' if [ -f $V- watchdog-terminate ]; then terminate_instance "No runners registered within timeout"; else terminate_instance "Script terminated"; fi' TERM
82+ trap ' if [ -f $RUNNER_STATE_DIR/ watchdog-terminate ]; then terminate_instance "No runners registered within timeout"; else terminate_instance "Script terminated"; fi' TERM
8283
8384# Set up registration timeout failsafe - terminate if runner doesn't register in time
8485REGISTRATION_TIMEOUT=" $runner_registration_timeout "
8586if ! [[ " $REGISTRATION_TIMEOUT " =~ ^[0-9]+$ ]]; then
8687 REGISTRATION_TIMEOUT=300
8788fi
8889# Create a marker file for watchdog termination request
89- touch $V - watchdog-active
90+ touch $RUNNER_STATE_DIR / watchdog-active
9091(
9192 sleep $REGISTRATION_TIMEOUT
92- if [ ! -f $V - registered ]; then
93- touch $V - watchdog-terminate
93+ if [ ! -f $RUNNER_STATE_DIR / registered ]; then
94+ touch $RUNNER_STATE_DIR / watchdog-terminate
9495 kill -TERM $$ 2> /dev/null || true
9596 fi
96- rm -f $V - watchdog-active
97+ rm -f $RUNNER_STATE_DIR / watchdog-active
9798) &
9899REGISTRATION_WATCHDOG_PID=$!
99- echo $REGISTRATION_WATCHDOG_PID > $V - watchdog.pid
100+ echo $REGISTRATION_WATCHDOG_PID > $RUNNER_STATE_DIR / watchdog.pid
100101
101102# Run any custom user data script provided by the user
102103if [ -n " $userdata " ]; then
@@ -151,21 +152,29 @@ if [ "$cloudwatch_logs_group" != "" ]; then
151152 rm amazon-cloudwatch-agent.rpm
152153 fi
153154
154- # Build CloudWatch config with factored strings
155- G=' ,"log_group_name":"' $cloudwatch_logs_group ' ","log_stream_name":"{instance_id}/'
156- Z=' ","timezone":"UTC"}'
157- H=" $homedir "
155+ # Build CloudWatch config
158156 cat > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json << EOF
159- {"agent":{"run_as_user":"cwagent"},"logs":{"logs_collected":{"files":{"collect_list":[
160- {"file_path":"/var/log/runner-setup.log${G} runner-setup$Z "},
161- {"file_path":"/var/log/runner-debug.log${G} runner-debug$Z "},
162- {"file_path":"/tmp/job-started-hook.log${G} job-started$Z "},
163- {"file_path":"/tmp/job-completed-hook.log${G} job-completed$Z "},
164- {"file_path":"/tmp/termination-check.log${G} termination$Z "},
165- {"file_path":"/tmp/runner-*-config.log${G} runner-config$Z "},
166- {"file_path":"$H /_diag/Runner_**.log${G} runner-diag$Z "},
167- {"file_path":"$H /_diag/Worker_**.log${G} worker-diag$Z "}
168- ]}}}}
157+ {
158+ "agent": {
159+ "run_as_user": "cwagent"
160+ },
161+ "logs": {
162+ "logs_collected": {
163+ "files": {
164+ "collect_list": [
165+ { "file_path": "/var/log/runner-setup.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/runner-setup" , "timezone": "UTC" },
166+ { "file_path": "/var/log/runner-debug.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/runner-debug" , "timezone": "UTC" },
167+ { "file_path": "/tmp/job-started-hook.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/job-started" , "timezone": "UTC" },
168+ { "file_path": "/tmp/job-completed-hook.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/job-completed", "timezone": "UTC" },
169+ { "file_path": "/tmp/termination-check.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/termination" , "timezone": "UTC" },
170+ { "file_path": "/tmp/runner-*-config.log" , "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/runner-config", "timezone": "UTC" },
171+ { "file_path": "$homedir /_diag/Runner_**.log", "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/runner-diag" , "timezone": "UTC" },
172+ { "file_path": "$homedir /_diag/Worker_**.log", "log_group_name": "$cloudwatch_logs_group ", "log_stream_name": "{instance_id}/worker-diag" , "timezone": "UTC" }
173+ ]
174+ }
175+ }
176+ }
177+ }
169178EOF
170179
171180 if ! /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s; then
@@ -257,14 +266,14 @@ fetch_script "job-completed-hook.sh"
257266fetch_script " check-runner-termination.sh"
258267
259268# Replace log prefix placeholders with actual values
260- sed -i " s/LOG_PREFIX_JOB_STARTED/${log_prefix_job_started} /g" $B /job-started-hook.sh
261- sed -i " s/LOG_PREFIX_JOB_COMPLETED/${log_prefix_job_completed} /g" $B /job-completed-hook.sh
269+ sed -i " s/LOG_PREFIX_JOB_STARTED/${log_prefix_job_started} /g" $BIN_DIR /job-started-hook.sh
270+ sed -i " s/LOG_PREFIX_JOB_COMPLETED/${log_prefix_job_completed} /g" $BIN_DIR /job-completed-hook.sh
262271
263- chmod +x $B /job-started-hook.sh $B /job-completed-hook.sh $B /check-runner-termination.sh
272+ chmod +x $BIN_DIR /job-started-hook.sh $BIN_DIR /job-completed-hook.sh $BIN_DIR /check-runner-termination.sh
264273
265274# Set up job tracking directory
266- mkdir -p $V - jobs
267- touch $V - last-activity
275+ mkdir -p $RUNNER_STATE_DIR / jobs
276+ touch $RUNNER_STATE_DIR / last-activity
268277
269278# Set up periodic termination check using systemd
270279cat > /etc/systemd/system/runner-termination-check.service << EOF
@@ -276,7 +285,7 @@ Type=oneshot
276285Environment="RUNNER_GRACE_PERIOD=$runner_grace_period "
277286Environment="RUNNER_INITIAL_GRACE_PERIOD=$runner_initial_grace_period "
278287Environment="RUNNER_POLL_INTERVAL=$runner_poll_interval "
279- ExecStart=$B /check-runner-termination.sh
288+ ExecStart=$BIN_DIR /check-runner-termination.sh
280289EOF
281290
282291cat > /etc/systemd/system/runner-termination-check.timer << EOF
367376
368377if [ $succeeded -gt 0 ]; then
369378 log " $succeeded runner(s) registered and started successfully"
370- touch $V - registered
379+ touch $RUNNER_STATE_DIR / registered
371380else
372381 log_error " No runners registered successfully"
373382 terminate_instance " No runners registered successfully"
374383fi
375384
376385# Kill registration watchdog now that runners are registered
377- if [ -f $V - watchdog.pid ]; then
378- WATCHDOG_PID=$( cat $V - watchdog.pid)
386+ if [ -f $RUNNER_STATE_DIR / watchdog.pid ]; then
387+ WATCHDOG_PID=$( cat $RUNNER_STATE_DIR / watchdog.pid)
379388 kill $WATCHDOG_PID 2> /dev/null || true
380- rm -f $V - watchdog.pid
389+ rm -f $RUNNER_STATE_DIR / watchdog.pid
381390fi
382391
383392# Final setup - ensure runner directories are accessible for debugging
384- touch $V - started
393+ touch $RUNNER_STATE_DIR / started
385394chmod o+x $homedir
386395for RUNNER_DIR in $homedir /runner-* ; do
387396 [ -d " $RUNNER_DIR /_diag" ] && chmod 755 " $RUNNER_DIR /_diag"
0 commit comments