Skip to content

Commit 06daf07

Browse files
authored
Create run_linux.sh
1 parent a437aac commit 06daf07

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

Github/Runners/run_linux.sh

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#!/usr/bin/env bash
2+
3+
##Helper Script to auto run self-hosted runners
4+
5+
#------------------------------------------------------------------------------------#
6+
#Requires passwordless sudo
7+
if [ "$(id -u)" -eq 0 ]; then
8+
echo -e "\n[+] USER:$(whoami) Running as root, skipping passwordless Sudo Checks"
9+
else
10+
if sudo -n -l | grep -q NOPASSWD; then
11+
echo -e "\n[+] Passwordless sudo is Configured"
12+
sudo -n -l 2>/dev/null
13+
else
14+
echo -e "\n[-] Passwordless sudo is NOT Configured"
15+
echo -e "\n[-] READ: https://web.archive.org/web/20230614212916/https://linuxhint.com/setup-sudo-no-password-linux/\n"
16+
#exit
17+
exit 1
18+
fi
19+
fi
20+
#------------------------------------------------------------------------------------#
21+
22+
#------------------------------------------------------------------------------------#
23+
#Sanity Check
24+
if ! command -v podman &> /dev/null; then
25+
#If this doesn't work with sudo: sudo ln -s "$(which podman)" "/usr/local/bin/podman"
26+
echo -e "\n[-] Podman is NOT Installed/Configured"
27+
echo -e "[-] Install ALL Dependencies && Configure ENV VARS|PATH\n"
28+
echo -e "\n[-] READ: https://github.com/pkgforge/devscripts/blob/main/Github/Runners/README.md#additional-notes--refs\n"
29+
exit 1
30+
fi
31+
if ! command -v docker &> /dev/null; then
32+
echo -e "\n[-] Docker is NOT Installed/Configured"
33+
echo -e "[-] Install ALL Dependencies && Configure ENV VARS|PATH\n"
34+
echo -e "\n[-] READ: https://github.com/pkgforge/devscripts/blob/main/Github/Runners/README.md#additional-notes--refs\n"
35+
exit 1
36+
fi
37+
#------------------------------------------------------------------------------------#
38+
39+
#------------------------------------------------------------------------------------#
40+
##ENV
41+
SYSTMP="$(dirname $(mktemp -u))" && export SYSTMP="$SYSTMP"
42+
USER="$(whoami)" && export USER="${USER}"
43+
HOME="$(getent passwd ${USER} | cut -d: -f6)" && export HOME="${HOME}" ; pushd "${HOME}" >/dev/null 2>&1
44+
echo -e "\n[+] USER = ${USER}"
45+
echo -e "[+] HOME = ${HOME}"
46+
echo -e "[+] WORKDIR = $(realpath .)"
47+
echo -e "[+] PATH = ${PATH}\n"
48+
#Name+{rand}
49+
if [ -z "${PODMAN_CONTAINER_NAME}" ]; then
50+
echo -e "\n[+] Setting Default Container Name: gh-runner-arm64x-gcp"
51+
export PODMAN_CONTAINER_NAME="gh-runner-arm64x-gcp"
52+
sudo podman stop "${PODMAN_CONTAINER_NAME}" >/dev/null 2>&1
53+
else
54+
export PODMAN_CONTAINER_NAME="${PODMAN_CONTAINER_NAME}"
55+
echo -e "\n[+] Setting Default Container Name: ${PODMAN_CONTAINER_NAME}"
56+
sudo podman stop "${PODMAN_CONTAINER_NAME}" >/dev/null 2>&1
57+
fi
58+
#Image
59+
if [ -z "${PODMAN_CONTAINER_IMAGE}" ]; then
60+
echo -e "\n[+] Setting Default Container Image: azathothas/gh-runner-aarch64-ubuntu"
61+
export PODMAN_CONTAINER_IMAGE="azathothas/gh-runner-aarch64-ubuntu"
62+
sudo podman rmi "${PODMAN_CONTAINER_IMAGE}" --force >/dev/null 2>&1
63+
sudo podman pull "${PODMAN_CONTAINER_IMAGE}"
64+
else
65+
export PODMAN_CONTAINER_IMAGE="${PODMAN_CONTAINER_IMAGE}"
66+
echo -e "\n[+] Setting Default Container Image: ${PODMAN_CONTAINER_IMAGE}"
67+
sudo podman rmi "${PODMAN_CONTAINER_IMAGE}" --force >/dev/null 2>&1
68+
sudo podman pull "${PODMAN_CONTAINER_IMAGE}"
69+
fi
70+
#Env File
71+
if [ -z "${PODMAN_ENV_FILE}" ]; then
72+
echo -e "\n[+] Setting Default Container Env File: ${HOME}/.config/gh-runner/.env"
73+
export PODMAN_ENV_FILE="${HOME}/.config/gh-runner/.env"
74+
if ! [[ -s "${PODMAN_ENV_FILE}" ]]; then
75+
echo -e "\n[-] Fatal: Empty/Non Existent ${PODMAN_ENV_FILE} file!"
76+
exit 1
77+
fi
78+
else
79+
export PODMAN_ENV_FILE="${PODMAN_ENV_FILE}"
80+
echo -e "\n[+] Setting Default Container Env File: ${PODMAN_ENV_FILE}"
81+
if ! [[ -s "${PODMAN_ENV_FILE}" ]]; then
82+
echo -e "\n[-] Fatal: Empty/Non Existent ${PODMAN_ENV_FILE} file!"
83+
exit 1
84+
fi
85+
fi
86+
#Log File
87+
if [ -z "${PODMAN_LOG_FILE}" ]; then
88+
PODMAN_LOG_FILE="$(mktemp)" && export PODMAN_LOG_FILE="${PODMAN_LOG_FILE}"
89+
echo -e "\n[+] Setting Default Container LOG File: ${PODMAN_LOG_FILE}"
90+
echo -e "[+] View Logs: tail -f ${PODMAN_LOG_FILE}\n"
91+
else
92+
export PODMAN_LOG_FILE="${PODMAN_LOG_FILE}"
93+
echo -e "\n[+] Setting Default Container LOG File:${PODMAN_LOG_FILE}"
94+
echo -e "[+] View Logs: tail -f ${PODMAN_LOG_FILE}\n"
95+
fi
96+
#------------------------------------------------------------------------------------#
97+
98+
#------------------------------------------------------------------------------------#
99+
#Stop Existing
100+
echo -e "\n[+] Cleaning PreExisting Container\n"
101+
sudo podman stop "$(sudo podman ps -aqf name=${PODMAN_CONTAINER_NAME})" >/dev/null 2>&1 &
102+
wait
103+
sudo podman stop "$(sudo podman ps -aqf name=${PODMAN_CONTAINER_NAME})" >/dev/null 2>&1 && sleep 5
104+
#RUN
105+
echo -e "\n[+] Starting Runner Container (LOGFILE: ${PODMAN_LOG_FILE})\n"
106+
sudo mkdir -p "/var/lib/containers/tmp"
107+
set -x && nohup sudo podman run --privileged --network="bridge" --systemd="always" --ulimit="host" --volume="/var/lib/containers/tmp:/tmp" --tz="UTC" --pull="always" --name="${PODMAN_CONTAINER_NAME}" --rm --env-file="${PODMAN_ENV_FILE}" "${PODMAN_CONTAINER_IMAGE}" > "${PODMAN_LOG_FILE}" 2>&1 &
108+
set +x && echo -e "[+] Waiting 30s..." && sleep 30
109+
#Get logs
110+
PODMAN_ID="$(sudo podman ps -qf name=${PODMAN_CONTAINER_NAME})" && export PODMAN_ID="${PODMAN_ID}"
111+
PODMAN_LOGPATH="$(sudo podman inspect --format='{{.HostConfig.LogConfig.Path}}' ${PODMAN_CONTAINER_NAME})" && export PODMAN_LOGPATH="${PODMAN_LOGPATH}"
112+
echo -e "\n[+] Writing Logs to ${PODMAN_LOGPATH} (${PODMAN_CONTAINER_NAME} :: ${PODMAN_ID})\n"
113+
sudo podman exec --user "runner" --env-file="${PODMAN_ENV_FILE}" "${PODMAN_ID}" "/usr/local/bin/manager.sh" >> "${PODMAN_LOG_FILE}" 2>&1 &
114+
set +x && echo -e "[+] Waiting 10s..." && sleep 10
115+
#sudo jq -r '.log' "${PODMAN_LOGPATH}""
116+
#Monitor & Stop on Exit
117+
set +x && echo -e "[+] Executing Runner..."
118+
while true; do
119+
if ! pgrep -f "/usr/local/bin/manager.sh" > /dev/null; then
120+
cat "${PODMAN_LOG_FILE}"
121+
sudo podman stop "${PODMAN_ID}" --ignore
122+
exit 0
123+
fi
124+
sleep 5
125+
done
126+
#------------------------------------------------------------------------------------#
127+
#END
128+
popd >/dev/null 2>&1
129+
echo -e "\n\n[+] Completed Runner ${PODMAN_CONTAINER_NAME} (LOGFILE: ${PODMAN_LOG_FILE})\n\n"
130+
sed '/^$/d' "${PODMAN_LOG_FILE}"
131+
echo -e "\n\n[+] Listing All Running Containers\n"
132+
sudo podman ps ; echo
133+
echo -e 'RUN (Remove ALL Containers): sudo podman ps -aq | xargs sudo podman stop 2>/dev/null && sudo podman rm "$(podman ps -aq)" --force' && echo
134+
echo -e 'RUN (Remove ALL Images): sudo podman rmi -f $(podman images -q) >/dev/null 2>&1' && echo
135+
#EOF
136+
#------------------------------------------------------------------------------------#

0 commit comments

Comments
 (0)