|
| 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