Last active
February 23, 2025 06:01
-
-
Save tamalsaha/af2f99c80f84410253bd1e532bdfabc7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
## This script downloads and generates a suitable ext4 image from existing cloud | |
## images. For simplicity it currently only downloads from Ubuntu images, but it | |
## should not be a big effort to adapt to other cloud images. | |
UBUNTU_VERSION=${1:-bionic} | |
IMAGE_SIZE=${2:-20G} | |
IMAGE_ROOTFS=images/$UBUNTU_VERSION/$UBUNTU_VERSION.rootfs | |
KERNEL_IMAGE=images/$UBUNTU_VERSION/$UBUNTU_VERSION.vmlinux | |
INITRD=images/$UBUNTU_VERSION/$UBUNTU_VERSION.initrd | |
function download() { | |
echo "Downloading $2..." | |
curl -s -o $1 $2 | |
} | |
function download_if_not_present() { | |
[ -f $1 ] || download $1 $2 | |
} | |
function generate_image() { | |
echo "Generating $IMAGE_ROOTFS..." | |
truncate -s $IMAGE_SIZE $IMAGE_ROOTFS | |
mkfs.ext4 $IMAGE_ROOTFS > /dev/null 2>&1 | |
local tmppath=/tmp/.$RANDOM-$RANDOM | |
mkdir $tmppath | |
sudo mount $IMAGE_ROOTFS -o loop $tmppath | |
sudo tar -xf images/$UBUNTU_VERSION/download/$image_tar --directory $tmppath | |
sudo umount $tmppath | |
rmdir $tmppath | |
} | |
function extract_vmlinux() { | |
echo "Extracting vmlinux to $KERNEL_IMAGE..." | |
local extract_linux=/tmp/.$RANDOM-$RANDOM | |
curl -s -o $extract_linux https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux | |
chmod +x $extract_linux | |
$extract_linux images/$UBUNTU_VERSION/download/$kernel > $KERNEL_IMAGE | |
rm $extract_linux | |
} | |
# Install required tools | |
export DEBIAN_FRONTEND=noninteractive | |
export DEBCONF_NONINTERACTIVE_SEEN=true | |
apt-get update | |
apt-get install -y --no-install-recommends apt-transport-https ca-certificates binutils xz-utils lzop bzip2 lz4 zstd | |
# Download components | |
mkdir -p images/$UBUNTU_VERSION/download | |
image_tar=$UBUNTU_VERSION-server-cloudimg-amd64-root.tar.xz | |
download_if_not_present \ | |
images/$UBUNTU_VERSION/download/$image_tar \ | |
https://cloud-images.ubuntu.com/$UBUNTU_VERSION/current/$image_tar | |
kernel=$UBUNTU_VERSION-server-cloudimg-amd64-vmlinuz-generic | |
download_if_not_present \ | |
images/$UBUNTU_VERSION/download/$kernel \ | |
https://cloud-images.ubuntu.com/$UBUNTU_VERSION/current/unpacked/$kernel | |
initrd=$UBUNTU_VERSION-server-cloudimg-amd64-initrd-generic | |
download_if_not_present \ | |
images/$UBUNTU_VERSION/download/$initrd \ | |
https://cloud-images.ubuntu.com/$UBUNTU_VERSION/current/unpacked/$initrd | |
# Generate image, kernel and link initrd | |
[ -f $IMAGE_ROOTFS ] || generate_image | |
[ -f $INITRD ] || mv images/$UBUNTU_VERSION/download/$initrd $INITRD | |
[ -f $KERNEL_IMAGE ] || extract_vmlinux | |
rm -rf images/$UBUNTU_VERSION/download |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/bin/bash | |
set -e | |
# Notes: | |
# PATS over envvars are more secure | |
# Downloads latest runner release (not pre-release) | |
# Configures it as a service more secure | |
# Should be used on VMs and not containers | |
# Works on OSX and Linux | |
# Assumes x64 arch | |
# See EXAMPLES below | |
flags_found=false | |
while getopts 's:g:n:r:u:l:df' opt; do | |
flags_found=true | |
case $opt in | |
s) | |
runner_scope=$OPTARG | |
;; | |
g) | |
ghe_hostname=$OPTARG | |
;; | |
n) | |
runner_name=$OPTARG | |
;; | |
r) | |
runner_group=$OPTARG | |
;; | |
u) | |
svc_user=$OPTARG | |
;; | |
l) | |
labels=$OPTARG | |
;; | |
f) | |
replace='true' | |
;; | |
d) | |
disableupdate='true' | |
;; | |
*) | |
echo " | |
Runner Service Installer | |
Examples: | |
RUNNER_CFG_PAT=<yourPAT> ./create-latest-svc.sh myuser/myrepo my.ghe.deployment.net | |
RUNNER_CFG_PAT=<yourPAT> ./create-latest-svc.sh -s myorg -u user_name -l label1,label2 | |
Usage: | |
export RUNNER_CFG_PAT=<yourPAT> | |
./create-latest-svc scope [ghe_domain] [name] [user] [labels] | |
-s required scope: repo (:owner/:repo) or org (:organization) | |
-g optional ghe_hostname: the fully qualified domain name of your GitHub Enterprise Server deployment | |
-n optional name of the runner, defaults to hostname | |
-r optional name of the runner group to add the runner to, defaults to the Default group | |
-u optional user svc will run as, defaults to current | |
-l optional list of labels (split by comma) applied on the runner | |
-d optional allow runner to remain on the current version for one month after the release of a newer version | |
-f optional replace any existing runner with the same name" | |
exit 0 | |
;; | |
esac | |
done | |
shift "$((OPTIND - 1))" | |
if ! "$flags_found"; then | |
runner_scope=${1} | |
ghe_hostname=${2} | |
runner_name=${3:-$(hostname)} | |
svc_user=${4:-$USER} | |
labels=${5} | |
runner_group=${6} | |
fi | |
# apply defaults | |
runner_name=${runner_name:-$(hostname)} | |
svc_user=${svc_user:-$USER} | |
echo "Configuring runner @ ${runner_scope}" | |
sudo echo | |
#--------------------------------------- | |
# Validate Environment | |
#--------------------------------------- | |
runner_plat=linux | |
[ ! -z "$(which sw_vers)" ] && runner_plat=osx; | |
function fatal() | |
{ | |
echo "error: $1" >&2 | |
exit 1 | |
} | |
if [ -z "${runner_scope}" ]; then fatal "supply scope as argument 1"; fi | |
if [ -z "${RUNNER_CFG_PAT}" ]; then fatal "RUNNER_CFG_PAT must be set before calling"; fi | |
which curl || fatal "curl required. Please install in PATH with apt-get, brew, etc" | |
which jq || fatal "jq required. Please install in PATH with apt-get, brew, etc" | |
# bail early if there's already a runner there. also sudo early | |
if [ -d ./runner ]; then | |
fatal "Runner already exists. Use a different directory or delete ./runner" | |
fi | |
sudo -u ${svc_user} mkdir runner | |
# TODO: validate not in a container | |
# TODO: validate systemd or osx svc installer | |
#-------------------------------------- | |
# Get a config token | |
#-------------------------------------- | |
echo | |
echo "Generating a registration token..." | |
base_api_url="https://api.github.com" | |
if [ -n "${ghe_hostname}" ]; then | |
base_api_url="https://${ghe_hostname}/api/v3" | |
fi | |
# if the scope has a slash, it's a repo runner | |
orgs_or_repos="orgs" | |
if [[ "$runner_scope" == *\/* ]]; then | |
orgs_or_repos="repos" | |
fi | |
export RUNNER_TOKEN=$(curl -s -X POST ${base_api_url}/${orgs_or_repos}/${runner_scope}/actions/runners/registration-token -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" | jq -r '.token') | |
if [ "null" == "$RUNNER_TOKEN" -o -z "$RUNNER_TOKEN" ]; then fatal "Failed to get a token"; fi | |
#--------------------------------------- | |
# Download latest released and extract | |
#--------------------------------------- | |
echo | |
echo "Downloading latest runner ..." | |
# For the GHES Alpha, download the runner from github.com | |
latest_version_label=$(curl -s -X GET 'https://api.github.com/repos/actions/runner/releases/latest' | jq -r '.tag_name') | |
latest_version=$(echo ${latest_version_label:1}) | |
runner_file="actions-runner-${runner_plat}-x64-${latest_version}.tar.gz" | |
if [ -f "${runner_file}" ]; then | |
echo "${runner_file} exists. skipping download." | |
else | |
runner_url="https://github.com/actions/runner/releases/download/${latest_version_label}/${runner_file}" | |
echo "Downloading ${latest_version_label} for ${runner_plat} ..." | |
echo $runner_url | |
curl -O -L ${runner_url} | |
fi | |
ls -la *.tar.gz | |
#--------------------------------------------------- | |
# extract to runner directory in this directory | |
#--------------------------------------------------- | |
echo | |
echo "Extracting ${runner_file} to ./runner" | |
tar xzf "./${runner_file}" -C runner | |
# export of pass | |
sudo chown -R $svc_user ./runner | |
pushd ./runner | |
#--------------------------------------- | |
# Unattend config | |
#--------------------------------------- | |
runner_url="https://github.com/${runner_scope}" | |
if [ -n "${ghe_hostname}" ]; then | |
runner_url="https://${ghe_hostname}/${runner_scope}" | |
fi | |
echo | |
echo "Configuring ${runner_name} @ $runner_url" | |
echo "./config.sh --unattended --url $runner_url --token *** --name $runner_name ${labels:+--labels $labels} ${runner_group:+--runnergroup \"$runner_group\"} ${disableupdate:+--disableupdate} --ephemeral" | |
sudo -E -u ${svc_user} ./config.sh --unattended --url $runner_url --token $RUNNER_TOKEN ${replace:+--replace} --name $runner_name ${labels:+--labels $labels} ${runner_group:+--runnergroup "$runner_group"} ${disableupdate:+--disableupdate} --ephemeral | |
#--------------------------------------- | |
# Configuring as a service | |
#--------------------------------------- | |
echo | |
echo "Configuring as a service ..." | |
prefix="" | |
if [ "${runner_plat}" == "linux" ]; then | |
prefix="sudo " | |
fi | |
${prefix}./svc.sh install ${svc_user} | |
${prefix}./svc.sh start |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/bin/bash | |
set -e | |
# Notes: | |
# PATS over envvars are more secure | |
# Downloads latest runner release (not pre-release) | |
# Configures it as a service more secure | |
# Should be used on VMs and not containers | |
# Works on OSX and Linux | |
# Assumes x64 arch | |
# See EXAMPLES below | |
runner_plat=linux | |
[ ! -z "$(which sw_vers)" ] && runner_plat=osx | |
if [ -z "${RUNNER_CFG_PAT}" ]; then fatal "RUNNER_CFG_PAT must be set before calling"; fi | |
#--------------------------------------- | |
# Download latest released and extract | |
#--------------------------------------- | |
echo | |
echo "Downloading latest runner ..." | |
# For the GHES Alpha, download the runner from github.com | |
latest_version_label=$(curl -s -H "authorization: token ${RUNNER_CFG_PAT}" -X GET 'https://api.github.com/repos/actions/runner/releases/latest' | jq -r '.tag_name') | |
latest_version=$(echo ${latest_version_label:1}) | |
runner_file="actions-runner-${runner_plat}-x64-${latest_version}.tar.gz" | |
if [ -f "${runner_file}" ]; then | |
echo "${runner_file} exists. skipping download." | |
else | |
runner_url="https://github.com/actions/runner/releases/download/${latest_version_label}/${runner_file}" | |
echo "Downloading ${latest_version_label} for ${runner_plat} ..." | |
echo $runner_url | |
curl -O -L ${runner_url} | |
fi | |
ls -la *.tar.gz | |
# download wait_for_job tool | |
curl -fsSLO https://github.com/appscodelabs/gh-ci-webhook/releases/latest/download/gh-ci-webhook-linux-amd64.tar.gz | |
tar -xzvf gh-ci-webhook-linux-amd64.tar.gz | |
rm -rf LICENSE gh-ci-webhook-linux-amd64.tar.gz | |
mv gh-ci-webhook-linux-amd64 gh-ci-webhook | |
chmod +x gh-ci-webhook | |
./gh-ci-webhook wait-for-job --nats-addr=$NATS_URL --testrig=$TESTRIG | |
cat job_vars.txt | |
source job_vars.txt | |
# runner_scope=$(cat repo_owner.txt) | |
flags_found=false | |
while getopts 's:g:n:r:u:l:df' opt; do | |
flags_found=true | |
case $opt in | |
s) | |
runner_scope=$OPTARG | |
;; | |
g) | |
ghe_hostname=$OPTARG | |
;; | |
n) | |
runner_name=$OPTARG | |
;; | |
r) | |
runner_group=$OPTARG | |
;; | |
u) | |
svc_user=$OPTARG | |
;; | |
l) | |
labels=$OPTARG | |
;; | |
f) | |
replace='true' | |
;; | |
d) | |
disableupdate='true' | |
;; | |
*) | |
echo " | |
Runner Service Installer | |
Examples: | |
RUNNER_CFG_PAT=<yourPAT> ./create-latest-svc.sh myuser/myrepo my.ghe.deployment.net | |
RUNNER_CFG_PAT=<yourPAT> ./create-latest-svc.sh -s myorg -u user_name -l label1,label2 | |
Usage: | |
export RUNNER_CFG_PAT=<yourPAT> | |
./create-latest-svc scope [ghe_domain] [name] [user] [labels] | |
-s required scope: repo (:owner/:repo) or org (:organization) | |
-g optional ghe_hostname: the fully qualified domain name of your GitHub Enterprise Server deployment | |
-n optional name of the runner, defaults to hostname | |
-r optional name of the runner group to add the runner to, defaults to the Default group | |
-u optional user svc will run as, defaults to current | |
-l optional list of labels (split by comma) applied on the runner | |
-d optional allow runner to remain on the current version for one month after the release of a newer version | |
-f optional replace any existing runner with the same name" | |
exit 0 | |
;; | |
esac | |
done | |
shift "$((OPTIND - 1))" | |
if ! "$flags_found"; then | |
runner_scope=${1} | |
ghe_hostname=${2} | |
runner_name=${3:-$(hostname)} | |
svc_user=${4:-$USER} | |
labels=${5} | |
runner_group=${6} | |
fi | |
# apply defaults | |
runner_name=${runner_name:-$(hostname)} | |
svc_user=${svc_user:-$USER} | |
echo "Configuring runner @ ${runner_scope}" | |
sudo echo | |
#--------------------------------------- | |
# Validate Environment | |
#--------------------------------------- | |
function fatal() { | |
echo "error: $1" >&2 | |
exit 1 | |
} | |
if [ -z "${runner_scope}" ]; then fatal "supply scope as argument 1"; fi | |
if [ -z "${RUNNER_CFG_PAT}" ]; then fatal "RUNNER_CFG_PAT must be set before calling"; fi | |
which curl || fatal "curl required. Please install in PATH with apt-get, brew, etc" | |
which jq || fatal "jq required. Please install in PATH with apt-get, brew, etc" | |
# bail early if there's already a runner there. also sudo early | |
if [ -d ./runner ]; then | |
fatal "Runner already exists. Use a different directory or delete ./runner" | |
fi | |
sudo -u ${svc_user} mkdir runner | |
# TODO: validate not in a container | |
# TODO: validate systemd or osx svc installer | |
#-------------------------------------- | |
# Get a config token | |
#-------------------------------------- | |
echo | |
echo "Generating a registration token..." | |
base_api_url="https://api.github.com" | |
if [ -n "${ghe_hostname}" ]; then | |
base_api_url="https://${ghe_hostname}/api/v3" | |
fi | |
# if the scope has a slash, it's a repo runner | |
orgs_or_repos="orgs" | |
if [[ "$runner_scope" == *\/* ]]; then | |
orgs_or_repos="repos" | |
fi | |
export RUNNER_TOKEN=$(curl -s -X POST ${base_api_url}/${orgs_or_repos}/${runner_scope}/actions/runners/registration-token -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" | jq -r '.token') | |
if [ "null" == "$RUNNER_TOKEN" -o -z "$RUNNER_TOKEN" ]; then fatal "Failed to get a token"; fi | |
#--------------------------------------------------- | |
# extract to runner directory in this directory | |
#--------------------------------------------------- | |
echo | |
echo "Extracting ${runner_file} to ./runner" | |
tar xzf "./${runner_file}" -C runner | |
# export of pass | |
sudo chown -R $svc_user ./runner | |
pushd ./runner | |
#--------------------------------------- | |
# Unattend config | |
#--------------------------------------- | |
runner_url="https://github.com/${runner_scope}" | |
if [ -n "${ghe_hostname}" ]; then | |
runner_url="https://${ghe_hostname}/${runner_scope}" | |
fi | |
echo | |
echo "Configuring ${runner_name} @ $runner_url" | |
echo "./config.sh --unattended --url $runner_url --token *** --name $runner_name ${labels:+--labels $labels} ${runner_group:+--runnergroup \"$runner_group\"} ${disableupdate:+--disableupdate} --ephemeral" | |
sudo -E -u ${svc_user} ./config.sh --unattended --url $runner_url --token $RUNNER_TOKEN ${replace:+--replace} --name $runner_name ${labels:+--labels $labels} ${runner_group:+--runnergroup "$runner_group"} ${disableupdate:+--disableupdate} --ephemeral | |
#--------------------------------------- | |
# Configuring as a service | |
#--------------------------------------- | |
echo | |
echo "Configuring as a service ..." | |
prefix="" | |
if [ "${runner_plat}" == "linux" ]; then | |
prefix="sudo " | |
fi | |
${prefix}./svc.sh install ${svc_user} | |
${prefix}./svc.sh start |
Author
tamalsaha
commented
Nov 6, 2022
•
apt install --reinstall linux-modules-`uname -r`
ls -l /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/ip_tables.ko
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment