act_runner/scripts/run.sh

58 lines
1.9 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
if [[ ! -d /data ]]; then
mkdir -p /data
fi
cd /data
Added environment variable for run.sh to specify runner state file. (#377) Added environment variable `RUNNER_STATE_FILE` to let users specify where `run.sh` looks for the runner JSON file. Defaults to ``.runner`` to preserve the original behavior. Addresses issue #368. It's not my preferred solution but it's the least invasive one I can think of. I'm happy to make any changes you want. I didn't see an appropriate place to reference the change in the documentation. I will add documentation wherever you think is appropriate. To test this I did the following: * Built an image with the `make docker` command and pushed it to my private registry. * Added that private image as the image in my existing docker stack that was exhibiting the behavior described in #368. * Added the RUNNER_STATE_FILE environment variable pointing to the runner JSON file set in my `config.yml` (``/data/runner.json`` in this case). * Configured a new runner in gitea and added the token as an environment variable in the stack config. * Deployed the stack and verified the new runner was recognized (in the idle state). * Force updated the runner service to restart the container. * Verified the same runner was still recognized in gitea (in the idle state) once it was back up and running. Here is the relevant config. It's stored as a template so I've left the things that would normally be redacted as they are in the template. ``` runner: image: hub.hax.in.net/haxwithaxe/act_runner:dev1 networks: - swarm-net environment: RUNNER_STATE_FILE: /data/runner.json CONFIG_FILE: /data/config.yml GITEA_INSTANCE_URL: "https://git_gitea" GITEA_RUNNER_REGISTRATION_TOKEN: "{{ git_runner_reg_token }}" GITEA_RUNNER_NAME: "git_runner" volumes: - runner_data:/data - /var/run/docker.sock:/var/run/docker.sock ``` `runner_data` is a glusterfs subvolume Thanks for creating this gitea specific fork. Apart from the issue this pull request addresses it works so well I don't have to think about it once it's set up. Co-authored-by: haxwithaxe <spam@haxwithaxe.net> Reviewed-on: https://gitea.com/gitea/act_runner/pulls/377 Co-authored-by: haxwithaxe <haxwithaxe@noreply.gitea.com> Co-committed-by: haxwithaxe <haxwithaxe@noreply.gitea.com>
2023-10-16 01:21:53 +02:00
RUNNER_STATE_FILE=${RUNNER_STATE_FILE:-'.runner'}
CONFIG_ARG=""
if [[ ! -z "${CONFIG_FILE}" ]]; then
CONFIG_ARG="--config ${CONFIG_FILE}"
fi
EXTRA_ARGS=""
if [[ ! -z "${GITEA_RUNNER_LABELS}" ]]; then
EXTRA_ARGS="${EXTRA_ARGS} --labels ${GITEA_RUNNER_LABELS}"
fi
# In case no token is set, it's possible to read the token from a file, i.e. a Docker Secret
if [[ -z "${GITEA_RUNNER_REGISTRATION_TOKEN}" ]] && [[ -f "${GITEA_RUNNER_REGISTRATION_TOKEN_FILE}" ]]; then
GITEA_RUNNER_REGISTRATION_TOKEN=$(cat "${GITEA_RUNNER_REGISTRATION_TOKEN_FILE}")
fi
# Use the same ENV variable names as https://github.com/vegardit/docker-gitea-act-runner
Added environment variable for run.sh to specify runner state file. (#377) Added environment variable `RUNNER_STATE_FILE` to let users specify where `run.sh` looks for the runner JSON file. Defaults to ``.runner`` to preserve the original behavior. Addresses issue #368. It's not my preferred solution but it's the least invasive one I can think of. I'm happy to make any changes you want. I didn't see an appropriate place to reference the change in the documentation. I will add documentation wherever you think is appropriate. To test this I did the following: * Built an image with the `make docker` command and pushed it to my private registry. * Added that private image as the image in my existing docker stack that was exhibiting the behavior described in #368. * Added the RUNNER_STATE_FILE environment variable pointing to the runner JSON file set in my `config.yml` (``/data/runner.json`` in this case). * Configured a new runner in gitea and added the token as an environment variable in the stack config. * Deployed the stack and verified the new runner was recognized (in the idle state). * Force updated the runner service to restart the container. * Verified the same runner was still recognized in gitea (in the idle state) once it was back up and running. Here is the relevant config. It's stored as a template so I've left the things that would normally be redacted as they are in the template. ``` runner: image: hub.hax.in.net/haxwithaxe/act_runner:dev1 networks: - swarm-net environment: RUNNER_STATE_FILE: /data/runner.json CONFIG_FILE: /data/config.yml GITEA_INSTANCE_URL: "https://git_gitea" GITEA_RUNNER_REGISTRATION_TOKEN: "{{ git_runner_reg_token }}" GITEA_RUNNER_NAME: "git_runner" volumes: - runner_data:/data - /var/run/docker.sock:/var/run/docker.sock ``` `runner_data` is a glusterfs subvolume Thanks for creating this gitea specific fork. Apart from the issue this pull request addresses it works so well I don't have to think about it once it's set up. Co-authored-by: haxwithaxe <spam@haxwithaxe.net> Reviewed-on: https://gitea.com/gitea/act_runner/pulls/377 Co-authored-by: haxwithaxe <haxwithaxe@noreply.gitea.com> Co-committed-by: haxwithaxe <haxwithaxe@noreply.gitea.com>
2023-10-16 01:21:53 +02:00
test -f "$RUNNER_STATE_FILE" || echo "$RUNNER_STATE_FILE is missing or not a regular file"
Added environment variable for run.sh to specify runner state file. (#377) Added environment variable `RUNNER_STATE_FILE` to let users specify where `run.sh` looks for the runner JSON file. Defaults to ``.runner`` to preserve the original behavior. Addresses issue #368. It's not my preferred solution but it's the least invasive one I can think of. I'm happy to make any changes you want. I didn't see an appropriate place to reference the change in the documentation. I will add documentation wherever you think is appropriate. To test this I did the following: * Built an image with the `make docker` command and pushed it to my private registry. * Added that private image as the image in my existing docker stack that was exhibiting the behavior described in #368. * Added the RUNNER_STATE_FILE environment variable pointing to the runner JSON file set in my `config.yml` (``/data/runner.json`` in this case). * Configured a new runner in gitea and added the token as an environment variable in the stack config. * Deployed the stack and verified the new runner was recognized (in the idle state). * Force updated the runner service to restart the container. * Verified the same runner was still recognized in gitea (in the idle state) once it was back up and running. Here is the relevant config. It's stored as a template so I've left the things that would normally be redacted as they are in the template. ``` runner: image: hub.hax.in.net/haxwithaxe/act_runner:dev1 networks: - swarm-net environment: RUNNER_STATE_FILE: /data/runner.json CONFIG_FILE: /data/config.yml GITEA_INSTANCE_URL: "https://git_gitea" GITEA_RUNNER_REGISTRATION_TOKEN: "{{ git_runner_reg_token }}" GITEA_RUNNER_NAME: "git_runner" volumes: - runner_data:/data - /var/run/docker.sock:/var/run/docker.sock ``` `runner_data` is a glusterfs subvolume Thanks for creating this gitea specific fork. Apart from the issue this pull request addresses it works so well I don't have to think about it once it's set up. Co-authored-by: haxwithaxe <spam@haxwithaxe.net> Reviewed-on: https://gitea.com/gitea/act_runner/pulls/377 Co-authored-by: haxwithaxe <haxwithaxe@noreply.gitea.com> Co-committed-by: haxwithaxe <haxwithaxe@noreply.gitea.com>
2023-10-16 01:21:53 +02:00
if [[ ! -s "$RUNNER_STATE_FILE" ]]; then
try=$((try + 1))
success=0
# The point of this loop is to make it simple, when running both act_runner and gitea in docker,
# for the act_runner to wait a moment for gitea to become available before erroring out. Within
# the context of a single docker-compose, something similar could be done via healthchecks, but
# this is more flexible.
while [[ $success -eq 0 ]] && [[ $try -lt ${GITEA_MAX_REG_ATTEMPTS:-10} ]]; do
act_runner register \
--instance "${GITEA_INSTANCE_URL}" \
--token "${GITEA_RUNNER_REGISTRATION_TOKEN}" \
--name "${GITEA_RUNNER_NAME:-`hostname`}" \
${CONFIG_ARG} ${EXTRA_ARGS} --no-interactive 2>&1 | tee /tmp/reg.log
cat /tmp/reg.log | grep 'Runner registered successfully' > /dev/null
if [[ $? -eq 0 ]]; then
echo "SUCCESS"
success=1
else
echo "Waiting to retry ..."
sleep 5
fi
done
fi
# Prevent reading the token from the act_runner process
unset GITEA_RUNNER_REGISTRATION_TOKEN
unset GITEA_RUNNER_REGISTRATION_TOKEN_FILE
exec act_runner daemon ${CONFIG_ARG}