1+ #! /bin/bash
2+ set -e
3+ INSTANCE_ID=$$ (curl -s http://169.254.169.254/latest/meta-data/instance-id)
4+ terminate_instance () {
5+ echo " FATAL: $$ 1" | tee -a /var/log/runner-setup.log
6+ [ -f " $$ H/config.sh" ] && cd " $$ H" && ./config.sh remove --token " $$ {RT}" 2> /dev/null || true
7+ shutdown -h now
8+ }
9+ trap ' terminate_instance "Error line $$LINENO"' ERR
10+ (sleep $$ {runner_registration_timeout:-300}; [ ! -f /var/run/ghr-reg ] && terminate_instance " Registration timeout" ) &
11+ RWP=$$ !
12+ $userdata
13+ H=" $homedir "
14+ [ -z " $$ H" -o " $$ H" = " AUTO" ] && for u in ubuntu ec2-user centos admin debian fedora; do
15+ id $$ u & > /dev/null && H=" /home/$$ u" && break
16+ done
17+ [ -z " $$ H" -o " $$ H" = " AUTO" ] && H=$$ (getent passwd| awk -F: ' $$3>=1000&&$$3<65534&&$$6~/^\/home\//{print $$6;exit}' )
18+ [ -z " $$ H" ] && H=" /home/ec2-user"
19+ cd " $$ H"
20+ nohup bash -c " sleep $$ {max_instance_lifetime}m && shutdown -h now" & > /dev/null &
21+ if [ " $cloudwatch_logs_group " != " " ]; then
22+ apt-get update && apt-get install -y amazon-cloudwatch-agent || yum install -y amazon-cloudwatch-agent
23+ cat> /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json<< EOF
24+ {"logs":{"logs_collected":{"files":{"collect_list":[
25+ {"file_path":"/var/log/runner-setup.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/runner-setup"},
26+ {"file_path":"/tmp/job-started-hook.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/job-started"},
27+ {"file_path":"/tmp/job-completed-hook.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/job-completed"},
28+ {"file_path":"/tmp/termination-check.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/termination"},
29+ {"file_path":"$$ H/_diag/Runner_**.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/runner-diag"},
30+ {"file_path":"$$ H/_diag/Worker_**.log","log_group_name":"$cloudwatch_logs_group ","log_stream_name":"$$ {INSTANCE_ID}/worker-diag"}
31+ ]}}}}
32+ EOF
33+ systemctl start amazon-cloudwatch-agent
34+ fi
35+ [ " $ssh_pubkey " != " " ] && mkdir -p $$ H/.ssh && echo " $ssh_pubkey " >> $$ H/.ssh/authorized_keys && chmod 700 $$ H/.ssh && chmod 600 $$ H/.ssh/authorized_keys
36+ exec & > /var/log/runner-setup.log
37+ echo " $script " > pre-runner-script.sh && source pre-runner-script.sh
38+ export RUNNER_ALLOW_RUNASROOT=1
39+ curl -L $runner_release -o runner.tar.gz && tar --no-overwrite-dir -xzf runner.tar.gz
40+ cat> /usr/local/bin/job-started-hook.sh<< 'E '
41+ #!/bin/bash
42+ exec>>/tmp/job-started-hook.log 2>&1
43+ echo "[$$(date)] Job started: $$GITHUB_JOB"
44+ touch /var/run/ghr-act
45+ mkdir -p /var/run/ghr-jobs
46+ echo '{"s":"r"}' > /var/run/ghr-jobs/$$GITHUB_RUN_ID-$$GITHUB_JOB.job
47+ E
48+ cat> /usr/local/bin/job-completed-hook.sh<< 'E '
49+ #!/bin/bash
50+ exec>>/tmp/job-completed-hook.log 2>&1
51+ echo "[$$(date)] Job completed: $$GITHUB_JOB"
52+ rm -f /var/run/ghr-jobs/$$GITHUB_RUN_ID-$$GITHUB_JOB.job
53+ touch /var/run/ghr-act
54+ E
55+ cat> /usr/local/bin/check-runner-termination.sh<< 'E '
56+ #!/bin/bash
57+ exec>>/tmp/termination-check.log 2>&1
58+ [ ! -f /var/run/ghr-act ] && exit 0
59+ L=$$(stat -c %Y /var/run/ghr-act 2>/dev/null || stat -f %m /var/run/ghr-act)
60+ I=$$(($$(date +%s)-L))
61+ G=$${RUNNER_GRACE_PERIOD:-60}
62+ [ ! -f /var/run/ghr-started ] && G=$${RUNNER_INITIAL_GRACE_PERIOD:-180}
63+ R=$$(ls /var/run/ghr-jobs/*.job 2>/dev/null|wc -l)
64+ [ $$R -eq 0 -a $$I -gt $$G ] && { [ -f $$H/config.sh ] && cd $$H && RUNNER_ALLOW_RUNASROOT=1 ./config.sh remove --token $${RT} || true; shutdown -h now; }
65+ E
66+ chmod +x /usr/local/bin/* -hook.sh
67+ cat> /etc/systemd/system/ghr-term.service<< EOF
68+ [Unit]
69+ Description=Check Runner Term
70+ [Service]
71+ Type=oneshot
72+ Environment="RUNNER_GRACE_PERIOD=$runner_grace_period "
73+ Environment="RUNNER_INITIAL_GRACE_PERIOD=$runner_initial_grace_period "
74+ Environment="RT=$token "
75+ Environment="H=$$ H"
76+ ExecStart=/usr/local/bin/check-runner-termination.sh
77+ EOF
78+ cat> /etc/systemd/system/ghr-term.timer<< EOF
79+ [Unit]
80+ Description=Runner Term Timer
81+ [Timer]
82+ OnBootSec=60s
83+ OnUnitActiveSec=$$ {runner_poll_interval}s
84+ [Install]
85+ WantedBy=timers.target
86+ EOF
87+ systemctl daemon-reload && systemctl enable --now ghr-term.timer
88+ IT=$$ (curl -s http://169.254.169.254/latest/meta-data/instance-type)
89+ RN=" i-$$ {INSTANCE_ID:2}"
90+ ML=" ,instance-id:$$ {INSTANCE_ID},instance-type:$$ {IT},workflow:$github_workflow ,run-id:$github_run_id ,run-number:$github_run_number "
91+ AL=" $labels $$ {ML}"
92+ export RT=" $token "
93+ ./config.sh --url https://github.com/$repo --token $token --labels " $$ AL" --name " $$ RN" --disableupdate
94+ touch /var/run/ghr-reg
95+ [ -n " $$ RWP" ] && kill $$ RWP 2> /dev/null || true
96+ touch /var/run/ghr-started
97+ mkdir -p $$ H/_diag && chmod 755 $$ H/_diag && chmod o+x $$ H
98+ cat> .env<< EOF
99+ RUNNER_HOME=$$ H
100+ ACTIONS_RUNNER_HOOK_JOB_STARTED=/usr/local/bin/job-started-hook.sh
101+ ACTIONS_RUNNER_HOOK_JOB_COMPLETED=/usr/local/bin/job-completed-hook.sh
102+ EOF
103+ ./run.sh
0 commit comments