Skip to content

Commit

Permalink
Use self update ready entrypoint (#99)
Browse files Browse the repository at this point in the history
* Use self update ready entrypoint

* Add --once support for runsvc.sh

Run `cd runner; NAME=$DOCKER_USER/actions-runner TAG=dev make docker-build docker-push`,
`kubectl apply -f release/actions-runner-controller.yaml`,
then update the runner image(not the controller image) by updating e.g. `Runner.Spec.Image` to `$DOCKER_USER/actions-runner:$TAG`, for testing.

Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>
  • Loading branch information
ytsarev and mumoshu authored Oct 4, 2020
1 parent b1ba5bf commit b79ea98
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 3 deletions.
1 change: 1 addition & 0 deletions runner/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ RUN mkdir -p /runner \
&& rm -rf /var/lib/apt/lists/*

COPY entrypoint.sh /runner
COPY patched /runner/patched

USER runner:runner
ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
Expand Down
5 changes: 3 additions & 2 deletions runner/Makefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
NAME ?= summerwind/actions-runner
TAG ?= latest

RUNNER_VERSION ?= 2.273.4
DOCKER_VERSION ?= 19.03.12

docker-build:
docker build --build-arg RUNNER_VERSION=${RUNNER_VERSION} --build-arg DOCKER_VERSION=${DOCKER_VERSION} -t ${NAME}:latest -t ${NAME}:v${RUNNER_VERSION} .
docker build --build-arg RUNNER_VERSION=${RUNNER_VERSION} --build-arg DOCKER_VERSION=${DOCKER_VERSION} -t ${NAME}:${TAG} -t ${NAME}:v${RUNNER_VERSION} .

docker-push:
docker push ${NAME}:latest
docker push ${NAME}:${TAG}
docker push ${NAME}:v${RUNNER_VERSION}
8 changes: 7 additions & 1 deletion runner/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,11 @@ fi
cd /runner
./config.sh --unattended --replace --name "${RUNNER_NAME}" --url "https://github.com/${ATTACH}" --token "${RUNNER_TOKEN}" ${LABEL_ARG}

for f in runsvc.sh RunnerService.js; do
diff {bin,patched}/${f} || :
sudo mv bin/${f}{,.bak}
sudo mv {patched,bin}/${f}
done

unset RUNNER_NAME RUNNER_REPO RUNNER_TOKEN
exec ./run.sh --once
exec ./bin/runsvc.sh --once
91 changes: 91 additions & 0 deletions runner/patched/RunnerService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env node
// Copyright (c) GitHub. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

var childProcess = require("child_process");
var path = require("path")

var supported = ['linux', 'darwin']

if (supported.indexOf(process.platform) == -1) {
console.log('Unsupported platform: ' + process.platform);
console.log('Supported platforms are: ' + supported.toString());
process.exit(1);
}

var stopping = false;
var listener = null;

var runService = function() {
var listenerExePath = path.join(__dirname, '../bin/Runner.Listener');
var interactive = process.argv[2] === "interactive";

if(!stopping) {
try {
if (interactive) {
console.log('Starting Runner listener interactively');
listener = childProcess.spawn(listenerExePath, ['run'].concat(process.argv.slice(3)), { env: process.env });
} else {
console.log('Starting Runner listener with startup type: service');
listener = childProcess.spawn(listenerExePath, ['run', '--startuptype', 'service'].concat(process.argv.slice(2)), { env: process.env });
}

console.log('Started listener process');

listener.stdout.on('data', (data) => {
process.stdout.write(data.toString('utf8'));
});

listener.stderr.on('data', (data) => {
process.stdout.write(data.toString('utf8'));
});

listener.on('close', (code) => {
console.log(`Runner listener exited with error code ${code}`);

if (code === 0) {
console.log('Runner listener exit with 0 return code, stop the service, no retry needed.');
stopping = true;
} else if (code === 1) {
console.log('Runner listener exit with terminated error, stop the service, no retry needed.');
stopping = true;
} else if (code === 2) {
console.log('Runner listener exit with retryable error, re-launch runner in 5 seconds.');
} else if (code === 3) {
console.log('Runner listener exit because of updating, re-launch runner in 5 seconds.');
} else {
console.log('Runner listener exit with undefined return code, re-launch runner in 5 seconds.');
}

if(!stopping) {
setTimeout(runService, 5000);
}
});

} catch(ex) {
console.log(ex);
}
}
}

runService();
console.log('Started running service');

var gracefulShutdown = function(code) {
console.log('Shutting down runner listener');
stopping = true;
if (listener) {
console.log('Sending SIGINT to runner listener to stop');
listener.kill('SIGINT');

// TODO wait for 30 seconds and send a SIGKILL
}
}

process.on('SIGINT', () => {
gracefulShutdown(0);
});

process.on('SIGTERM', () => {
gracefulShutdown(0);
});
20 changes: 20 additions & 0 deletions runner/patched/runsvc.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/bash

# convert SIGTERM signal to SIGINT
# for more info on how to propagate SIGTERM to a child process see: http://veithen.github.io/2014/11/16/sigterm-propagation.html
trap 'kill -INT $PID' TERM INT

if [ -f ".path" ]; then
# configure
export PATH=`cat .path`
echo ".path=${PATH}"
fi

# insert anything to setup env when running as a service

# run the host process which keep the listener alive
./externals/node12/bin/node ./bin/RunnerService.js $* &
PID=$!
wait $PID
trap - TERM INT
wait $PID

0 comments on commit b79ea98

Please sign in to comment.