Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand Down
4 changes: 3 additions & 1 deletion runner/actions-runner-dind.ubuntu-20.04.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand Down
4 changes: 3 additions & 1 deletion runner/actions-runner-dind.ubuntu-22.04.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand Down
7 changes: 5 additions & 2 deletions runner/actions-runner.ubuntu-20.04.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
ARG EXTERNALS_DIR_NAME=externalstmp
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand All @@ -77,7 +80,7 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& tar xzf ./runner.tar.gz \
&& rm runner.tar.gz \
&& ./bin/installdependencies.sh \
&& mv ./externals ./externalstmp \
&& if [ "${EXTERNALS_DIR_NAME}" != externals ]; then mv ./externals ./${EXTERNALS_DIR_NAME}; fi \
# libyaml-dev is required for ruby/setup-ruby action.
# It is installed after installdependencies.sh and before removing /var/lib/apt/lists
# to avoid rerunning apt-update on its own.
Expand Down
8 changes: 6 additions & 2 deletions runner/actions-runner.ubuntu-22.04.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& curl -fLo /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_${ARCH} \
&& chmod +x /usr/bin/dumb-init

ENV RUNNER_ASSETS_DIR=/runnertmp
# Set this to /home/runner for compatibility with v1 runners
ARG RUNNER_ASSETS_DIR=/runnertmp
ENV RUNNER_ASSETS_DIR=$RUNNER_ASSETS_DIR
# Set this to "externals" for compatibility with v1 runners
ARG EXTERNALS_DIR_NAME=externalstmp
RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "i386" ]; then export ARCH=x64 ; fi \
&& mkdir -p "$RUNNER_ASSETS_DIR" \
Expand All @@ -54,7 +58,7 @@ RUN export ARCH=$(echo ${TARGETPLATFORM} | cut -d / -f2) \
&& tar xzf ./runner.tar.gz \
&& rm runner.tar.gz \
&& ./bin/installdependencies.sh \
&& mv ./externals ./externalstmp \
&& if [ "${EXTERNALS_DIR_NAME}" != externals ]; then mv ./externals ./${EXTERNALS_DIR_NAME}; fi \
# libyaml-dev is required for ruby/setup-ruby action.
# It is installed after installdependencies.sh and before removing /var/lib/apt/lists
# to avoid rerunning apt-update on its own.
Expand Down
229 changes: 122 additions & 107 deletions runner/startup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,130 +16,145 @@ if [ -n "${STARTUP_DELAY_IN_SECONDS}" ]; then
sleep "${STARTUP_DELAY_IN_SECONDS}"
fi

if [ -z "${GITHUB_URL}" ]; then
log.debug 'Working with public GitHub'
GITHUB_URL="https://github.com/"
else
length=${#GITHUB_URL}
last_char=${GITHUB_URL:length-1:1}

[[ $last_char != "/" ]] && GITHUB_URL="$GITHUB_URL/"; :
log.debug "Github endpoint URL ${GITHUB_URL}"
fi

if [ -z "${RUNNER_NAME}" ]; then
log.error 'RUNNER_NAME must be set'
if ! cd "${RUNNER_HOME}"; then
log.error "Failed to cd into ${RUNNER_HOME}"
exit 1
fi

if [ -n "${RUNNER_ORG}" ] && [ -n "${RUNNER_REPO}" ] && [ -n "${RUNNER_ENTERPRISE}" ]; then
ATTACH="${RUNNER_ORG}/${RUNNER_REPO}"
elif [ -n "${RUNNER_ORG}" ]; then
ATTACH="${RUNNER_ORG}"
elif [ -n "${RUNNER_REPO}" ]; then
ATTACH="${RUNNER_REPO}"
elif [ -n "${RUNNER_ENTERPRISE}" ]; then
ATTACH="enterprises/${RUNNER_ENTERPRISE}"
else
log.error 'At least one of RUNNER_ORG, RUNNER_REPO, or RUNNER_ENTERPRISE must be set'
exit 1
fi
# past that point, it's all relative pathes from /runner

if [ -z "${RUNNER_TOKEN}" ]; then
log.error 'RUNNER_TOKEN must be set'
exit 1
fi
# This is for registering ARC v0 runners.
# ARC v1 runners do not need config.sh for registering themselves.
# ARC v1 runners are supposed to given the ACTIONS_RUNNER_INPUT_JITCONFIG envvars
# so we use it as the trigger to skip config.sh.
if [ -z "${ACTIONS_RUNNER_INPUT_JITCONFIG:-}" ]; then
if [ -z "${GITHUB_URL}" ]; then
log.debug 'Working with public GitHub'
GITHUB_URL="https://github.com/"
else
length=${#GITHUB_URL}
last_char=${GITHUB_URL:length-1:1}

[[ $last_char != "/" ]] && GITHUB_URL="$GITHUB_URL/"; :
log.debug "Github endpoint URL ${GITHUB_URL}"
fi

if [ -z "${RUNNER_REPO}" ] && [ -n "${RUNNER_GROUP}" ];then
RUNNER_GROUPS=${RUNNER_GROUP}
fi
if [ -z "${RUNNER_NAME}" ]; then
log.error 'RUNNER_NAME must be set'
exit 1
fi

# Hack due to https://github.com/actions/actions-runner-controller/issues/252#issuecomment-758338483
if [ ! -d "${RUNNER_HOME}" ]; then
log.error "$RUNNER_HOME should be an emptyDir mount. Please fix the pod spec."
exit 1
fi
if [ -n "${RUNNER_ORG}" ] && [ -n "${RUNNER_REPO}" ] && [ -n "${RUNNER_ENTERPRISE}" ]; then
ATTACH="${RUNNER_ORG}/${RUNNER_REPO}"
elif [ -n "${RUNNER_ORG}" ]; then
ATTACH="${RUNNER_ORG}"
elif [ -n "${RUNNER_REPO}" ]; then
ATTACH="${RUNNER_REPO}"
elif [ -n "${RUNNER_ENTERPRISE}" ]; then
ATTACH="enterprises/${RUNNER_ENTERPRISE}"
else
log.error 'At least one of RUNNER_ORG, RUNNER_REPO, or RUNNER_ENTERPRISE must be set'
exit 1
fi

# if this is not a testing environment
if [[ "${UNITTEST:-}" == '' ]]; then
sudo chown -R runner:docker "$RUNNER_HOME"
# enable dotglob so we can copy a ".env" file to load in env vars as part of the service startup if one is provided
# loading a .env from the root of the service is part of the actions/runner logic
shopt -s dotglob
# use cp instead of mv to avoid issues when src and dst are on different devices
cp -r "$RUNNER_ASSETS_DIR"/* "$RUNNER_HOME"/
shopt -u dotglob
fi
if [ -z "${RUNNER_TOKEN}" ]; then
log.error 'RUNNER_TOKEN must be set'
exit 1
fi

if ! cd "${RUNNER_HOME}"; then
log.error "Failed to cd into ${RUNNER_HOME}"
exit 1
fi
if [ -z "${RUNNER_REPO}" ] && [ -n "${RUNNER_GROUP}" ];then
RUNNER_GROUPS=${RUNNER_GROUP}
fi

# past that point, it's all relative pathes from /runner
# Hack due to https://github.com/actions/actions-runner-controller/issues/252#issuecomment-758338483
if [ ! -d "${RUNNER_HOME}" ]; then
log.error "$RUNNER_HOME should be an emptyDir mount. Please fix the pod spec."
exit 1
fi

config_args=()
if [ "${RUNNER_FEATURE_FLAG_ONCE:-}" != "true" ] && [ "${RUNNER_EPHEMERAL}" == "true" ]; then
config_args+=(--ephemeral)
log.debug 'Passing --ephemeral to config.sh to enable the ephemeral runner.'
fi
if [ "${DISABLE_RUNNER_UPDATE:-}" == "true" ]; then
config_args+=(--disableupdate)
log.debug 'Passing --disableupdate to config.sh to disable automatic runner updates.'
fi
# if this is not a testing environment
if [[ "${UNITTEST:-}" == '' ]]; then
sudo chown -R runner:docker "$RUNNER_HOME"
# enable dotglob so we can copy a ".env" file to load in env vars as part of the service startup if one is provided
# loading a .env from the root of the service is part of the actions/runner logic
shopt -s dotglob
# use cp instead of mv to avoid issues when src and dst are on different devices
cp -r "$RUNNER_ASSETS_DIR"/* "$RUNNER_HOME"/
shopt -u dotglob
fi

update-status "Registering"

retries_left=10
while [[ ${retries_left} -gt 0 ]]; do
log.debug 'Configuring the runner.'
./config.sh --unattended --replace \
--name "${RUNNER_NAME}" \
--url "${GITHUB_URL}${ATTACH}" \
--token "${RUNNER_TOKEN}" \
--runnergroup "${RUNNER_GROUPS}" \
--labels "${RUNNER_LABELS}" \
--work "${RUNNER_WORKDIR}" "${config_args[@]}"

if [ -f .runner ]; then
log.debug 'Runner successfully configured.'
break
config_args=()
if [ "${RUNNER_FEATURE_FLAG_ONCE:-}" != "true" ] && [ "${RUNNER_EPHEMERAL}" == "true" ]; then
config_args+=(--ephemeral)
log.debug 'Passing --ephemeral to config.sh to enable the ephemeral runner.'
fi
if [ "${DISABLE_RUNNER_UPDATE:-}" == "true" ]; then
config_args+=(--disableupdate)
log.debug 'Passing --disableupdate to config.sh to disable automatic runner updates.'
fi

log.debug 'Configuration failed. Retrying'
retries_left=$((retries_left - 1))
sleep 1
done
update-status "Registering"

retries_left=10
while [[ ${retries_left} -gt 0 ]]; do
log.debug 'Configuring the runner.'
./config.sh --unattended --replace \
--name "${RUNNER_NAME}" \
--url "${GITHUB_URL}${ATTACH}" \
--token "${RUNNER_TOKEN}" \
--runnergroup "${RUNNER_GROUPS}" \
--labels "${RUNNER_LABELS}" \
--work "${RUNNER_WORKDIR}" "${config_args[@]}"

if [ -f .runner ]; then
log.debug 'Runner successfully configured.'
break
fi

if [ ! -f .runner ]; then
# we couldn't configure and register the runner; no point continuing
log.error 'Configuration failed!'
exit 2
fi
log.debug 'Configuration failed. Retrying'
retries_left=$((retries_left - 1))
sleep 1
done

# Note that ARC v1 runners do create this file, but only after the runner
# agent is up and running.
# On the other hand, this logic assumes the file to be created BEFORE
# the runner is up, by running `config.sh`, which is not present in a v1 runner deployment.
# That's why we need to skip this check for v1 runners.
# Otherwise v1 runner will never start up due to this check.
if [ ! -f .runner ]; then
# we couldn't configure and register the runner; no point continuing
log.error 'Configuration failed!'
exit 2
fi

cat .runner
# Note: the `.runner` file's content should be something like the below:
#
# $ cat /runner/.runner
# {
# "agentId": 117, #=> corresponds to the ID of the runner
# "agentName": "THE_RUNNER_POD_NAME",
# "poolId": 1,
# "poolName": "Default",
# "serverUrl": "https://pipelines.actions.githubusercontent.com/SOME_RANDOM_ID",
# "gitHubUrl": "https://github.com/USER/REPO",
# "workFolder": "/some/work/dir" #=> corresponds to Runner.Spec.WorkDir
# }
#
# Especially `agentId` is important, as other than listing all the runners in the repo,
# this is the only change we could get the exact runnner ID which can be useful for further
# GitHub API call like the below. Note that 171 is the agentId seen above.
# curl \
# -H "Accept: application/vnd.github.v3+json" \
# -H "Authorization: bearer ${GITHUB_TOKEN}"
# https://api.github.com/repos/USER/REPO/actions/runners/171
cat .runner
# Note: the `.runner` file's content should be something like the below:
#
# $ cat /runner/.runner
# {
# "agentId": 117, #=> corresponds to the ID of the runner
# "agentName": "THE_RUNNER_POD_NAME",
# "poolId": 1,
# "poolName": "Default",
# "serverUrl": "https://pipelines.actions.githubusercontent.com/SOME_RANDOM_ID",
# "gitHubUrl": "https://github.com/USER/REPO",
# "workFolder": "/some/work/dir" #=> corresponds to Runner.Spec.WorkDir
# }
#
# Especially `agentId` is important, as other than listing all the runners in the repo,
# this is the only change we could get the exact runnner ID which can be useful for further
# GitHub API call like the below. Note that 171 is the agentId seen above.
# curl \
# -H "Accept: application/vnd.github.v3+json" \
# -H "Authorization: bearer ${GITHUB_TOKEN}"
# https://api.github.com/repos/USER/REPO/actions/runners/171
fi

# Hack due to the DinD volumes
# This is necessary only for legacy ARC v0.x.
# ARC v1.x uses the "externals" as the copy source and "tmpDir" as the copy destionation.
# See https://github.com/actions/actions-runner-controller/blob/91c8991835016f8c6568f101d4a28185baec3dcc/charts/gha-runner-scale-set/templates/_helpers.tpl#L76-L87
if [ -z "${UNITTEST:-}" ] && [ -e ./externalstmp ]; then
mkdir -p ./externals
mv ./externalstmp/* ./externals/
Expand Down
6 changes: 4 additions & 2 deletions test/startup/should_retry_configuring/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ startup_log() {
}

log "Setting up test area"
export RUNNER_HOME=testarea
export RUNNER_HOME=$(pwd)/testarea
mkdir -p ${RUNNER_HOME}

log "Setting up the test config"
Expand Down Expand Up @@ -49,7 +49,9 @@ log ""

# Run the runner startup script which as a final step runs this
# unit tests run.sh as it was symlinked
../../../runner/startup.sh 2> >(startup_log)
cd ../../../runner
export PATH=${PATH}:$(pwd)
./startup.sh 2> >(startup_log)

if [ "$?" != "2" ]; then
error "========================================="
Expand Down
6 changes: 4 additions & 2 deletions test/startup/should_work_non_ephemeral/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ startup_log() {
}

log "Setting up test area"
export RUNNER_HOME=testarea
export RUNNER_HOME=$(pwd)/testarea
mkdir -p ${RUNNER_HOME}

log "Setting up the test"
Expand Down Expand Up @@ -49,7 +49,9 @@ log ""

# Run the runner entrypstartupoint script which as a final step runs this
# unit tests run.sh as it was symlinked
../../../runner/startup.sh 2> >(startup_log)
cd ../../../runner
export PATH=${PATH}:$(pwd)
./startup.sh 2> >(startup_log)

if [ "$?" != "0" ]; then
error "==========================================="
Expand Down
6 changes: 4 additions & 2 deletions test/startup/should_work_normally/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ startup_log() {
}

log "Setting up test area"
export RUNNER_HOME=testarea
export RUNNER_HOME=$(pwd)/testarea
mkdir -p ${RUNNER_HOME}

log "Setting up the test"
Expand Down Expand Up @@ -47,7 +47,9 @@ log ""

# Run the runner startup script which as a final step runs this
# unit tests run.sh as it was symlinked
../../../runner/startup.sh 2> >(startup_log)
cd ../../../runner
export PATH=${PATH}:$(pwd)
./startup.sh 2> >(startup_log)

if [ "$?" != "0" ]; then
error "=========================="
Expand Down
Loading