diff --git a/docs/automate.md b/docs/automate.md index feecef178..ac1382ef7 100644 --- a/docs/automate.md +++ b/docs/automate.md @@ -2,26 +2,57 @@ ## Latest Release as Service on Nix VMs -[Run or copy this script for your use](../scripts/create-latest-svc.sh) to automate configuring a runner as a service on Linux or Mac +## Export PAT -### Export PAT - -Create a GitHub PAT and export it before running the script +Before running any of these sample scripts, create a GitHub PAT and export it before running the script ```bash export RUNNER_CFG_PAT=yourPAT ``` -### Ceate service one liner +### Create running as a service -Repo level one liner; replace with yourorg/yourrepo (repo level) or just yourorg (org level) +**Scenario**: Run on a machine or VM (not container) which automates: + + - Resolving latest released runner + - Download and extract latest + - Acquire a registration token + - Configure the runner + - Run as a systemd (linux) or Launchd (osx) service + +[Sample script here](../scripts/create-latest-svc.sh) + +Run as a one-line. NOTE: replace with yourorg/yourrepo (repo level) or just yourorg (org level) ```bash curl https://raw.githubusercontent.com/actions/runner/automate/scripts/create-latest-svc.sh | bash -s yourorg/yourrepo ``` -### Uninstall service one liner +### Uninstall running as service -Repo level one liner; replace with yourorg/yourrepo (repo level) or just yourorg (org level) +**Scenario**: Run on a machine or VM (not container) which automates: + + - Stops and uninstalls the systemd (linux) or Launchd (osx) service + - Acquires a removal token + - Removes the runner + +[Sample script here](../scripts/remove-svc.sh) + +Repo level one liner. NOTE: replace with yourorg/yourrepo (repo level) or just yourorg (org level) ```bash curl https://raw.githubusercontent.com/actions/runner/automate/scripts/remove-svc.sh | bash -s yourorg/yourrepo ``` + +### Delete an offline runner + +**Scenario**: Deletes a registered runner that is offline: + + - Ensures the runner is offline + - Resolves id from name + - Deletes the runner + +[Sample script here](../scripts/delete.sh) + +Repo level one liner. NOTE: replace with yourorg/yourrepo (repo level) or just yourorg (org level) and replace runnername +```bash +curl https://raw.githubusercontent.com/actions/runner/automate/scripts/remove-svc.sh | bash -s yourorg/yourrepo runnername +``` diff --git a/scripts/delete.sh b/scripts/delete.sh new file mode 100755 index 000000000..30e23eb70 --- /dev/null +++ b/scripts/delete.sh @@ -0,0 +1,75 @@ +# +# Force deletes a runner from the service +# The caller should have already ensured the runner is gone and/or stopped +# +# Examples: +# RUNNER_CFG_PAT= ./delete.sh myuser/myrepo +# RUNNER_CFG_PAT= ./delete.sh myorg +# +# Usage: +# export RUNNER_CFG_PAT= +# ./delete.sh scope name +# +# scope required repo (:owner/:repo) or org (:organization) +# name optional defaults to hostname. name to delete +# +# Notes: +# PATS over envvars are more secure +# Works on OSX and Linux +# Assumes x64 arch +# + +runner_scope=${1} +runner_name=${2} + +echo "Deleting runner ${runner_name} @ ${runner_scope}" + +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 + +base_api_url="https://api.github.com/orgs" +if [[ "$runner_scope" == *\/* ]]; then + base_api_url="https://api.github.com/repos" +fi + + +#-------------------------------------- +# Ensure offline +#-------------------------------------- +runner_status=$(curl -s -X GET ${base_api_url}/${runner_scope}/actions/runners -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" \ + | jq -M -j ".runners | .[] | [select(.name == \"${runner_name}\")] | .[0].status") + +if [ -z "${runner_status}" ]; then + fatal "Could not find runner with name ${runner_name}" +fi + +echo "Status: ${runner_status}" + +if [ "${runner_status}" != "offline" ]; then + fatal "Runner should be offline before removing" +fi + +#-------------------------------------- +# Get id of runner to remove +#-------------------------------------- +runner_id=$(curl -s -X GET ${base_api_url}/${runner_scope}/actions/runners -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" \ + | jq -M -j ".runners | .[] | [select(.name == \"${runner_name}\")] | .[0].id") + +if [ -z "${runner_id}" ]; then + fatal "Could not find runner with name ${runner_name}" +fi + +echo "Removing id ${runner_id}" + +#-------------------------------------- +# Remove the runner +#-------------------------------------- +curl -s -X DELETE ${base_api_url}/${runner_scope}/actions/runners/${runner_id} -H "authorization: token ${RUNNER_CFG_PAT}" + +echo "Done." diff --git a/scripts/remove-svc.sh b/scripts/remove-svc.sh index 9770be575..bbe7be951 100755 --- a/scripts/remove-svc.sh +++ b/scripts/remove-svc.sh @@ -35,6 +35,24 @@ function fatal() 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 +#-------------------------------------- +# Get a remove token +#-------------------------------------- +echo +echo "Generating a registration token..." + +# if the scope has a slash, it's an repo runner +base_api_url="https://api.github.com/orgs" +if [[ "$runner_scope" == *\/* ]]; then + base_api_url="https://api.github.com/repos" +fi + +export REMOVE_TOKEN=$(curl -s -X POST ${base_api_url}/${runner_scope}/actions/runners/remove-token -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" | jq -r '.token') + +if [ -z "$REMOVE_TOKEN" ]; then fatal "Failed to get a token"; fi + +echo $REMOVE_TOKEN + #--------------------------------------- # Stop and uninstall the service #--------------------------------------- @@ -43,27 +61,4 @@ echo "Uninstall the service ..." pushd ./runner ./svc.sh stop ./svc.sh uninstall - -base_api_url="https://api.github.com/orgs" -if [[ "$runner_scope" == *\/* ]]; then - base_api_url="https://api.github.com/repos" -fi - -#-------------------------------------- -# Get id of runner to remove -#-------------------------------------- -runner_id=$(curl -s -X GET ${base_api_url}/${runner_scope}/actions/runners -H "accept: application/vnd.github.everest-preview+json" -H "authorization: token ${RUNNER_CFG_PAT}" \ - | jq -M -j ".runners | .[] | [select(.name == \"${runner_name}\")] | .[0].id") - -if [ -z "${runner_id}" ]; then - fatal "Could not find runner with name ${runner_name}" -fi - -echo "Removing id ${runner_id}" - -#-------------------------------------- -# Remove the runner -#-------------------------------------- -curl -s -X DELETE ${base_api_url}/${runner_scope}/actions/runners/${runner_id} -H "authorization: token ${RUNNER_CFG_PAT}" - -echo "Done." +./config.sh remove --token $REMOVE_TOKEN