From 20f9773e5fe15a39f60fc28809f79a9ec1eb2379 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 28 May 2020 16:50:33 +0200 Subject: [PATCH 01/15] code wip --- bin/cml-runner-entrypoint.js | 140 +++++++++++++++++++++++++++++++++++ docker/Dockerfile | 22 ++++++ docker/Dockerfile-gpu | 22 ++++++ package-lock.json | 124 +++++++++++++++++-------------- package.json | 5 +- src/github.js | 12 +++ src/gitlab.js | 5 ++ 7 files changed, 274 insertions(+), 56 deletions(-) create mode 100644 bin/cml-runner-entrypoint.js diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js new file mode 100644 index 000000000..625f6e880 --- /dev/null +++ b/bin/cml-runner-entrypoint.js @@ -0,0 +1,140 @@ +#!/usr/bin/env node + +const { spawn } = require('child_process'); +const { exec, randid } = require('../src/utils'); + +const { + DOCKER_MACHINE, + RUNNER_IDLE_TIMEOUT = 5 * 60 * 1000, + + RUNNER_REPO, + + RUNNER_PATH, + RUNNER_LABELS = '', + RUNNER_NAME = randid(), + RUNNER_EXECUTOR = 'shell', + RUNNER_RUNTIME = '', + RUNNER_IMAGE = 'davidgortega/cml:latest' +} = process.env; + +const IS_GITHUB = RUNNER_REPO.startsWith('https://github.com/'); +let TIMEOUT_TIMER = 0; + +process.env.GITHUB_REPOSITORY = RUNNER_REPO.replace('https://github.com/', ''); +process.env.CI_PROJECT_PATH = RUNNER_REPO.replace('https://gitlab.com/', ''); +const { get_runner_token } = IS_GITHUB + ? require('../src/github') + : require('../src/gitlab'); +let RUNNER_TOKEN; + +const shutdown_docker_machine = async () => { + console.log('Shutting down docker machine'); + try { + DOCKER_MACHINE && + console.log(await exec(`echo y | docker-machine rm ${DOCKER_MACHINE}`)); + } catch (err) { + console.log(err.message); + } +}; + +const shutdown = async error => { + try { + console.log('Unregistering runner'); + + try { + if (IS_GITHUB) { + console.log( + await exec( + `${RUNNER_PATH}/config.sh remove --token "${RUNNER_TOKEN}"` + ) + ); + } else { + console.log(await exec(`gitlab-runner verify --delete`)); + console.log( + await exec(`gitlab-runner unregister --name "${RUNNER_NAME}"`) + ); + } + } catch (err) {} + + await shutdown_docker_machine(); + + return process.exit(error ? 1 : 0); + } catch (err) { + console.error(err); + return process.exit(1); + } +}; + +process.on('SIGTERM', shutdown); +process.on('SIGINT', shutdown); + +const run = async () => { + RUNNER_TOKEN = await get_runner_token(); + if (!RUNNER_TOKEN) { + throw new Error( + 'RUNNER_TOKEN is needed to start the runner. Are you setting a runner?' + ); + } + + if (IS_GITHUB && RUNNER_EXECUTOR !== 'shell') { + throw new Error('Github only supports shell executor'); + } + + console.log(`Starting runner with ${RUNNER_EXECUTOR} executor`); + + let command; + if (IS_GITHUB) { + console.log('Registering Github runner'); + console.log( + await exec( + `${RUNNER_PATH}/config.sh --url "${RUNNER_REPO}" --token "${RUNNER_TOKEN}" --name "${RUNNER_NAME}" --labels "${RUNNER_LABELS}" --work "_work"` + ) + ); + + command = `${RUNNER_PATH}/run.sh`; + } else { + console.log('Registering Gitlab runner'); + console.log( + await exec(`gitlab-runner register \ + --non-interactive \ + --run-untagged="true" \ + --locked="false" \ + --access-level="not_protected" \ + --executor "${RUNNER_EXECUTOR}" \ + --docker-runtime "${RUNNER_RUNTIME}" \ + --docker-image "${RUNNER_IMAGE}" \ + --url "https://gitlab.com/" \ + --tag-list "${RUNNER_LABELS}" \ + --registration-token "${RUNNER_TOKEN}" \ + --name "${RUNNER_NAME}"`) + ); + + command = 'gitlab-runner start'; + } + + const proc = spawn(command, { + shell: true + }); + + proc.stderr.on('data', data => { + data && console.log(data.toString('utf8')); + }); + + proc.stdout.on('data', async data => { + data && console.log(data.toString('utf8')); + + if (data && IS_GITHUB) { + if (data.includes('Running job')) RUNNER_TOKEN = 0; + } + }); + + setTimeout(() => { + IS_GITHUB && TIMEOUT_TIMER >= RUNNER_IDLE_TIMEOUT && shutdown(); + TIMEOUT_TIMER++; + }, 1000); +}; + +run().catch(err => { + console.error(err.message); + shutdown(err); +}); diff --git a/docker/Dockerfile b/docker/Dockerfile index f84df8b75..71c36db77 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,3 +42,25 @@ RUN wget https://dvc.org/deb/dvc.list -O /etc/apt/sources.list.d/dvc.list && \ apt-get install -y libfontconfig-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* + +# DOCKER, DOCKER MACHINE, GITLAB RUNNER AND GITHUB RUNNER +ENV RUNNER_PATH=/home/runner +ENV RUNNER_ALLOW_RUNASROOT=1 + +RUN mkdir ${RUNNER_PATH} +WORKDIR ${RUNNER_PATH} + +RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ + curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ + chmod +x /usr/local/bin/docker-compose && \ + curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ + chmod +x /tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine && \ + wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 && \ + chmod +x /usr/local/bin/gitlab-runner && \ + gitlab-runner install --user=root --working-directory=${RUNNER_PATH} && \ + wget https://github.com/actions/runner/releases/download/v2.263.0/actions-runner-linux-x64-2.263.0.tar.gz && \ + tar xzf actions-runner-linux-x64-2.263.0.tar.gz && \ + ./bin/installdependencies.sh && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +CMD ["dvc_cml_docker_entrypoint"] diff --git a/docker/Dockerfile-gpu b/docker/Dockerfile-gpu index 79b7ac165..49d3b019a 100644 --- a/docker/Dockerfile-gpu +++ b/docker/Dockerfile-gpu @@ -87,3 +87,25 @@ RUN apt update && \ echo /usr/local/cuda/lib64/stubs > /etc/ld.so.conf.d/z-cuda-stubs.conf && \ ldconfig # TENSORFLOW ENDS + +# DOCKER, DOCKER MACHINE, GITLAB RUNNER AND GITHUB RUNNER +ENV RUNNER_PATH=/home/runner +ENV RUNNER_ALLOW_RUNASROOT=1 + +RUN mkdir ${RUNNER_PATH} +WORKDIR ${RUNNER_PATH} + +RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ + curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ + chmod +x /usr/local/bin/docker-compose && \ + curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ + chmod +x /tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine && \ + wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 && \ + chmod +x /usr/local/bin/gitlab-runner && \ + gitlab-runner install --user=root --working-directory=${RUNNER_PATH} && \ + wget https://github.com/actions/runner/releases/download/v2.263.0/actions-runner-linux-x64-2.263.0.tar.gz && \ + tar xzf actions-runner-linux-x64-2.263.0.tar.gz && \ + ./bin/installdependencies.sh && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +CMD ["dvc_cml_docker_entrypoint"] diff --git a/package-lock.json b/package-lock.json index fb59be649..77a42732d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dvcorg/cml", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10,9 +10,9 @@ "integrity": "sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w==" }, "@actions/github": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-2.1.1.tgz", - "integrity": "sha512-kAgTGUx7yf5KQCndVeHSwCNZuDBvPyxm5xKTswW2lofugeuC1AZX73nUUVDNaysnM9aKFMHv9YCdVJbg7syEyA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-2.2.0.tgz", + "integrity": "sha512-9UAZqn8ywdR70n3GwVle4N8ALosQs4z50N7XMXrSTUVOmVpaBC5kE3TRTT7qQdi3OaQV24mjGuJZsHUmhD+ZXw==", "requires": { "@actions/http-client": "^1.0.3", "@octokit/graphql": "^4.3.1", @@ -570,41 +570,31 @@ } }, "@octokit/auth-token": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", - "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.1.tgz", + "integrity": "sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA==", "requires": { - "@octokit/types": "^2.0.0" + "@octokit/types": "^4.0.1" } }, "@octokit/endpoint": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.1.tgz", - "integrity": "sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.2.tgz", + "integrity": "sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ==", "requires": { - "@octokit/types": "^2.11.1", + "@octokit/types": "^4.0.1", "is-plain-object": "^3.0.0", "universal-user-agent": "^5.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "requires": { - "os-name": "^3.1.0" - } - } } }, "@octokit/graphql": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", - "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.0.tgz", + "integrity": "sha512-StJWfn0M1QfhL3NKBz31e1TdDNZrHLLS57J2hin92SIfzlOVBuUaRkp31AGkGOAFOAVtyEX6ZiZcsjcJDjeb5g==", "requires": { "@octokit/request": "^5.3.0", - "@octokit/types": "^2.0.0", - "universal-user-agent": "^4.0.0" + "@octokit/types": "^4.0.1", + "universal-user-agent": "^5.0.0" } }, "@octokit/plugin-paginate-rest": { @@ -613,6 +603,16 @@ "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", "requires": { "@octokit/types": "^2.0.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "requires": { + "@types/node": ">= 8" + } + } } }, "@octokit/plugin-request-log": { @@ -627,39 +627,39 @@ "requires": { "@octokit/types": "^2.0.1", "deprecation": "^2.3.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "requires": { + "@types/node": ">= 8" + } + } } }, "@octokit/request": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.2.tgz", - "integrity": "sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.4.tgz", + "integrity": "sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ==", "requires": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", - "@octokit/types": "^2.11.1", + "@octokit/types": "^4.0.1", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", "once": "^1.4.0", "universal-user-agent": "^5.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "requires": { - "os-name": "^3.1.0" - } - } } }, "@octokit/request-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", - "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.1.tgz", + "integrity": "sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ==", "requires": { - "@octokit/types": "^2.0.0", + "@octokit/types": "^4.0.1", "deprecation": "^2.0.0", "once": "^1.4.0" } @@ -696,13 +696,29 @@ "deprecation": "^2.0.0", "once": "^1.4.0" } + }, + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "requires": { + "@types/node": ">= 8" + } + }, + "universal-user-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", + "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "requires": { + "os-name": "^3.1.0" + } } } }, "@octokit/types": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.12.2.tgz", - "integrity": "sha512-1GHLI/Jll3j6F0GbYyZPFTcHZMGjAiRfkTEoRUyaVVk2IWbDdwEiClAJvXzfXCDayuGSNCqAUH8lpjZtqW9GDw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.0.2.tgz", + "integrity": "sha512-+4X6qfhT/fk/5FD66395NrFLxCzD6FsGlpPwfwvnukdyfYbhiZB/FJltiT1XM5Q63rGGBSf9FPaNV3WpNHm54A==", "requires": { "@types/node": ">= 8" } @@ -808,9 +824,9 @@ } }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", + "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==" }, "@types/parse-json": { "version": "4.0.0", @@ -7776,9 +7792,9 @@ } }, "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", "requires": { "os-name": "^3.1.0" } diff --git a/package.json b/package.json index 1f9465f51..b29a3e232 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "cml-send-github-check": "./bin/cml-send-github-check.js", "cml-setup-env-remote": "./bin/cml-setup-env-remote.js", "cml-publish": "./bin/cml-publish.js", - "cml-tensorboard-dev": "./bin/cml-tensorboard-dev.js" + "cml-tensorboard-dev": "./bin/cml-tensorboard-dev.js", + "cml-runner-entrypoint": "./bin/cml-runner-entrypoint.js" }, "scripts": { "lintfix": "eslint --fix ./", @@ -43,7 +44,7 @@ }, "dependencies": { "@actions/core": "^1.2.0", - "@actions/github": "^2.0.0", + "@actions/github": "^2.2.0", "canvas": "^2.6.1", "file-type": "^14.2.0", "json-to-markdown-table2": "^1.0.1", diff --git a/src/github.js b/src/github.js index 88b372a56..6e1795764 100644 --- a/src/github.js +++ b/src/github.js @@ -88,6 +88,17 @@ const comment = async opts => { ); }; +const get_runner_token = async () => { + const { + data: { token } + } = await octokit.actions.createRegistrationToken({ + owner, + repo + }); + + return token; +}; + const handle_error = e => { core.setFailed(e.message); }; @@ -102,4 +113,5 @@ exports.ref_parser = ref_parser; exports.check_ran_ref = check_ran_ref; exports.create_check_report = create_check_report; exports.comment = comment; +exports.get_runner_token = get_runner_token; exports.handle_error = handle_error; diff --git a/src/gitlab.js b/src/gitlab.js index 740b545c0..b40b23333 100644 --- a/src/gitlab.js +++ b/src/gitlab.js @@ -63,6 +63,10 @@ const comment = async opts => { await fetch(endpoint, { method: 'POST', headers, body }); }; +const get_runner_token = async opts => { + throw new Error('Not yet implemented'); +}; + const handle_error = e => { console.log(e.message); process.exit(1); @@ -78,4 +82,5 @@ exports.ref_parser = ref_parser; exports.project_jobs = project_jobs; exports.check_ran_ref = check_ran_ref; exports.comment = comment; +exports.get_runner_token = get_runner_token; exports.handle_error = handle_error; From 168cf683972425a08f3850a79c63a30ce7832450 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 28 May 2020 17:00:20 +0200 Subject: [PATCH 02/15] TIMEOUT_TIMER --- bin/cml-runner-entrypoint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index 625f6e880..f46edb9d0 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -124,7 +124,7 @@ const run = async () => { data && console.log(data.toString('utf8')); if (data && IS_GITHUB) { - if (data.includes('Running job')) RUNNER_TOKEN = 0; + if (data.includes('Running job')) TIMEOUT_TIMER = 0; } }); From ab9ec9f73ceed097e5fc10472792433610aae3c1 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 28 May 2020 17:27:01 +0200 Subject: [PATCH 03/15] docker entrypoint --- bin/cml-runner-entrypoint.js | 4 +--- docker/Dockerfile | 2 +- docker/Dockerfile-gpu | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index f46edb9d0..bd78ad9e6 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -123,9 +123,7 @@ const run = async () => { proc.stdout.on('data', async data => { data && console.log(data.toString('utf8')); - if (data && IS_GITHUB) { - if (data.includes('Running job')) TIMEOUT_TIMER = 0; - } + if (data && IS_GITHUB && data.includes('Running job')) TIMEOUT_TIMER = 0; }); setTimeout(() => { diff --git a/docker/Dockerfile b/docker/Dockerfile index 71c36db77..02aede563 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -63,4 +63,4 @@ RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ ./bin/installdependencies.sh && \ apt-get clean && rm -rf /var/lib/apt/lists/* -CMD ["dvc_cml_docker_entrypoint"] +CMD ["cml-runner-entrypoint"] diff --git a/docker/Dockerfile-gpu b/docker/Dockerfile-gpu index 49d3b019a..c9e73cf7f 100644 --- a/docker/Dockerfile-gpu +++ b/docker/Dockerfile-gpu @@ -108,4 +108,4 @@ RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ ./bin/installdependencies.sh && \ apt-get clean && rm -rf /var/lib/apt/lists/* -CMD ["dvc_cml_docker_entrypoint"] +CMD ["cml-runner-entrypoint"] From b74827bbaff81f1b03af0094f6207f1610c7b37a Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 28 May 2020 17:31:11 +0200 Subject: [PATCH 04/15] setInterval --- bin/cml-runner-entrypoint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index bd78ad9e6..52fa4ed5d 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -126,7 +126,7 @@ const run = async () => { if (data && IS_GITHUB && data.includes('Running job')) TIMEOUT_TIMER = 0; }); - setTimeout(() => { + setInterval(() => { IS_GITHUB && TIMEOUT_TIMER >= RUNNER_IDLE_TIMEOUT && shutdown(); TIMEOUT_TIMER++; }, 1000); From 1f60175fe23f3f2b195fa2e031097908c2a002fc Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 28 May 2020 17:40:08 +0200 Subject: [PATCH 05/15] RUNNER_IDLE_TIMEOUT seconds --- bin/cml-runner-entrypoint.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index 52fa4ed5d..f8e82d99d 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -5,7 +5,7 @@ const { exec, randid } = require('../src/utils'); const { DOCKER_MACHINE, - RUNNER_IDLE_TIMEOUT = 5 * 60 * 1000, + RUNNER_IDLE_TIMEOUT = 5 * 60, RUNNER_REPO, @@ -129,6 +129,7 @@ const run = async () => { setInterval(() => { IS_GITHUB && TIMEOUT_TIMER >= RUNNER_IDLE_TIMEOUT && shutdown(); TIMEOUT_TIMER++; + console.log(TIMEOUT_TIMER); }, 1000); }; From ddf59cd7a61bff8eb2c4fc0eb0bc40bb8dc05e7f Mon Sep 17 00:00:00 2001 From: davidgortega Date: Tue, 2 Jun 2020 16:55:55 +0200 Subject: [PATCH 06/15] gitlab and docker runner --- .github/workflows/publish.yml | 63 ++++++++++++++++++++ bin/cml-runner-entrypoint.js | 105 ++++++++++++++++++++++------------ docker/Dockerfile | 22 ------- docker/Dockerfile-runner | 27 +++++++++ src/github.js | 5 ++ src/gitlab.js | 29 +++++++++- src/utils.js | 12 ++++ 7 files changed, 202 insertions(+), 61 deletions(-) create mode 100644 docker/Dockerfile-runner diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0cd529128..543baae4b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -91,6 +91,69 @@ jobs: cache: true tag_names: true + + - name: Publish CML runner docker image + # only publish if push to master (dvcorg/cml:latest) + # or create a tag in the repo (dvcorg/cml:tag) + # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + uses: elgohr/Publish-Docker-Github-Action@master + env: + DOCKER_FROM: cml + with: + name: dvcorg/cml + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + dockerfile: ./docker/Dockerfile + context: ./ + cache: true + tags: "runner" + buildargs: DOCKER_FROM + + - name: Publish cml-py3 runner docker image + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + uses: elgohr/Publish-Docker-Github-Action@master + env: + DOCKER_FROM: cml-py3 + with: + name: dvcorg/cml-py3 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + dockerfile: ./docker/Dockerfile-py3 + context: ./ + cache: true + tags: "runner" + buildargs: DOCKER_FROM + + - name: Publish cml-gpu runner docker image + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + uses: elgohr/Publish-Docker-Github-Action@master + env: + DOCKER_FROM: cml-gpu + with: + name: dvcorg/cml-gpu + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + dockerfile: ./docker/Dockerfile-gpu + context: ./ + cache: true + tags: "runner" + buildargs: DOCKER_FROM + + - name: Publish cml-gpu-py3 runner docker image + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + uses: elgohr/Publish-Docker-Github-Action@master + env: + DOCKER_FROM: cml-gpu-py3 + with: + name: dvcorg/cml-gpu-py3 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + dockerfile: ./docker/Dockerfile-gpu-py3 + context: ./ + cache: true + tags: "runner" + buildargs: DOCKER_FROM + - name: Publish to NPM if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') run: | diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index f8e82d99d..1f95aa6b1 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -2,30 +2,37 @@ const { spawn } = require('child_process'); const { exec, randid } = require('../src/utils'); +const { URL } = require('url'); const { - DOCKER_MACHINE, - RUNNER_IDLE_TIMEOUT = 5 * 60, + RUNNER_PATH, + DOCKER_MACHINE, RUNNER_REPO, - - RUNNER_PATH, + RUNNER_IDLE_TIMEOUT = 5 * 60, RUNNER_LABELS = '', RUNNER_NAME = randid(), RUNNER_EXECUTOR = 'shell', RUNNER_RUNTIME = '', - RUNNER_IMAGE = 'davidgortega/cml:latest' + RUNNER_IMAGE = 'dvcorg/cml:latest' } = process.env; -const IS_GITHUB = RUNNER_REPO.startsWith('https://github.com/'); +const { protocol, host, pathname } = new URL(RUNNER_REPO); +const RUNNER_REPO_ORIGIN = `${protocol}//${host}`; +process.env.GITHUB_REPOSITORY = process.env.CI_PROJECT_PATH = pathname.substring( + 1 +); +process.env.CI_API_V4_URL = `${RUNNER_REPO_ORIGIN}/api/v4/`; + +const IS_GITHUB = RUNNER_REPO_ORIGIN === 'https://github.com'; let TIMEOUT_TIMER = 0; +let JOB_RUNNING = false; +let RUNNER_TOKEN; +let GITLAB_CI_TOKEN; -process.env.GITHUB_REPOSITORY = RUNNER_REPO.replace('https://github.com/', ''); -process.env.CI_PROJECT_PATH = RUNNER_REPO.replace('https://gitlab.com/', ''); -const { get_runner_token } = IS_GITHUB +const { get_runner_token, register_runner } = IS_GITHUB ? require('../src/github') : require('../src/gitlab'); -let RUNNER_TOKEN; const shutdown_docker_machine = async () => { console.log('Shutting down docker machine'); @@ -51,14 +58,18 @@ const shutdown = async error => { } else { console.log(await exec(`gitlab-runner verify --delete`)); console.log( - await exec(`gitlab-runner unregister --name "${RUNNER_NAME}"`) + await exec( + `gitlab-runner unregister --url "${RUNNER_REPO_ORIGIN}" --token "${GITLAB_CI_TOKEN}" ` + ) ); } } catch (err) {} await shutdown_docker_machine(); - return process.exit(error ? 1 : 0); + if (error) throw error; + + return process.exit(0); } catch (err) { console.error(err); return process.exit(1); @@ -67,6 +78,7 @@ const shutdown = async error => { process.on('SIGTERM', shutdown); process.on('SIGINT', shutdown); +process.on('SIGQUIT', shutdown); const run = async () => { RUNNER_TOKEN = await get_runner_token(); @@ -94,46 +106,65 @@ const run = async () => { command = `${RUNNER_PATH}/run.sh`; } else { console.log('Registering Gitlab runner'); - console.log( - await exec(`gitlab-runner register \ - --non-interactive \ - --run-untagged="true" \ - --locked="false" \ - --access-level="not_protected" \ - --executor "${RUNNER_EXECUTOR}" \ - --docker-runtime "${RUNNER_RUNTIME}" \ - --docker-image "${RUNNER_IMAGE}" \ - --url "https://gitlab.com/" \ - --tag-list "${RUNNER_LABELS}" \ - --registration-token "${RUNNER_TOKEN}" \ - --name "${RUNNER_NAME}"`) - ); - - command = 'gitlab-runner start'; + const runner = await register_runner({ + tags: RUNNER_LABELS, + token: RUNNER_TOKEN + }); + + GITLAB_CI_TOKEN = runner.token; + + command = `gitlab-runner --log-format="json" run-single + --url "https://gitlab.com/" + --token "${runner.token}" + --executor "${RUNNER_EXECUTOR}" + --docker-runtime "${RUNNER_RUNTIME}" + --docker-image "${RUNNER_IMAGE}" + --wait-timeout ${RUNNER_IDLE_TIMEOUT} + --name "${RUNNER_NAME}" + --request-concurrency 1 + --limit 1`; } - const proc = spawn(command, { - shell: true - }); + const proc = spawn(command, { shell: true }); proc.stderr.on('data', data => { data && console.log(data.toString('utf8')); + + if (data && !IS_GITHUB) { + try { + const { msg } = JSON.parse(data); + msg.includes('runner has not received a job') && shutdown(); + } catch (err) {} + } }); proc.stdout.on('data', async data => { data && console.log(data.toString('utf8')); - if (data && IS_GITHUB && data.includes('Running job')) TIMEOUT_TIMER = 0; + if (data && IS_GITHUB && data.includes('Running job')) { + JOB_RUNNING = true; + TIMEOUT_TIMER = 0; + } + + if ( + data && + IS_GITHUB && + data.includes('Job') && + data.includes('completed with result') + ) { + JOB_RUNNING = false; + } }); - setInterval(() => { - IS_GITHUB && TIMEOUT_TIMER >= RUNNER_IDLE_TIMEOUT && shutdown(); - TIMEOUT_TIMER++; - console.log(TIMEOUT_TIMER); + const watcher = setInterval(() => { + IS_GITHUB && + TIMEOUT_TIMER >= RUNNER_IDLE_TIMEOUT && + shutdown() && + clearInterval(watcher); + if (!JOB_RUNNING) TIMEOUT_TIMER++; }, 1000); }; run().catch(err => { - console.error(err.message); shutdown(err); }); diff --git a/docker/Dockerfile b/docker/Dockerfile index 02aede563..f84df8b75 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,25 +42,3 @@ RUN wget https://dvc.org/deb/dvc.list -O /etc/apt/sources.list.d/dvc.list && \ apt-get install -y libfontconfig-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* - -# DOCKER, DOCKER MACHINE, GITLAB RUNNER AND GITHUB RUNNER -ENV RUNNER_PATH=/home/runner -ENV RUNNER_ALLOW_RUNASROOT=1 - -RUN mkdir ${RUNNER_PATH} -WORKDIR ${RUNNER_PATH} - -RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ - curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ - chmod +x /usr/local/bin/docker-compose && \ - curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ - chmod +x /tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine && \ - wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 && \ - chmod +x /usr/local/bin/gitlab-runner && \ - gitlab-runner install --user=root --working-directory=${RUNNER_PATH} && \ - wget https://github.com/actions/runner/releases/download/v2.263.0/actions-runner-linux-x64-2.263.0.tar.gz && \ - tar xzf actions-runner-linux-x64-2.263.0.tar.gz && \ - ./bin/installdependencies.sh && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -CMD ["cml-runner-entrypoint"] diff --git a/docker/Dockerfile-runner b/docker/Dockerfile-runner new file mode 100644 index 000000000..88abafecf --- /dev/null +++ b/docker/Dockerfile-runner @@ -0,0 +1,27 @@ +ARG DOCKER_FROM=cml + +FROM dvcorg/${DOCKER_FROM}:latest as base + +LABEL maintainer="dvc.org" + +# DOCKER, DOCKER MACHINE, GITLAB RUNNER AND GITHUB RUNNER +ENV RUNNER_PATH=/home/runner +ENV RUNNER_ALLOW_RUNASROOT=1 + +RUN mkdir ${RUNNER_PATH} +WORKDIR ${RUNNER_PATH} + +RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ + curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ + chmod +x /usr/local/bin/docker-compose && \ + curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ + chmod +x /tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine && \ + wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 && \ + chmod +x /usr/local/bin/gitlab-runner && \ + gitlab-runner install --user=root --working-directory=${RUNNER_PATH} && \ + wget https://github.com/actions/runner/releases/download/v2.263.0/actions-runner-linux-x64-2.263.0.tar.gz && \ + tar xzf actions-runner-linux-x64-2.263.0.tar.gz && \ + ./bin/installdependencies.sh && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +CMD ["cml-runner-entrypoint"] diff --git a/src/github.js b/src/github.js index 6e1795764..fc05aa707 100644 --- a/src/github.js +++ b/src/github.js @@ -99,6 +99,10 @@ const get_runner_token = async () => { return token; }; +const register_runner = async opts => { + throw new Error('not yet implemented'); +}; + const handle_error = e => { core.setFailed(e.message); }; @@ -114,4 +118,5 @@ exports.check_ran_ref = check_ran_ref; exports.create_check_report = create_check_report; exports.comment = comment; exports.get_runner_token = get_runner_token; +exports.register_runner = register_runner; exports.handle_error = handle_error; diff --git a/src/gitlab.js b/src/gitlab.js index b40b23333..397ccfe98 100644 --- a/src/gitlab.js +++ b/src/gitlab.js @@ -63,8 +63,32 @@ const comment = async opts => { await fetch(endpoint, { method: 'POST', headers, body }); }; -const get_runner_token = async opts => { - throw new Error('Not yet implemented'); +const get_runner_token = async () => { + const endpoint = `${CI_API_V4_URL}/projects/${owner}%2F${repo}`; + const headers = { 'PRIVATE-TOKEN': TOKEN, Accept: 'application/json' }; + const response = await fetch(endpoint, { method: 'GET', headers }); + const project = await response.json(); + + return project.runners_token; +}; + +const register_runner = async opts => { + const endpoint = `${CI_API_V4_URL}/runners`; + + console.log(endpoint); + const headers = { 'PRIVATE-TOKEN': TOKEN, Accept: 'application/json' }; + + const body = new URLSearchParams(); + body.append('token', opts.token); + body.append('locked', 'true'); + body.append('run_untagged', 'true'); + body.append('access_level', 'not_protected'); + body.append('tag_list', opts.tags); + + const response = await fetch(endpoint, { method: 'POST', headers, body }); + const runner = await response.json(); + + return runner; }; const handle_error = e => { @@ -83,4 +107,5 @@ exports.project_jobs = project_jobs; exports.check_ran_ref = check_ran_ref; exports.comment = comment; exports.get_runner_token = get_runner_token; +exports.register_runner = register_runner; exports.handle_error = handle_error; diff --git a/src/utils.js b/src/utils.js index 64b83b82a..abb2a5e20 100644 --- a/src/utils.js +++ b/src/utils.js @@ -52,6 +52,18 @@ const upload = async opts => { return { mime, size, uri }; }; +const randid = () => { + return ( + Math.random() + .toString(36) + .substring(2, 7) + + Math.random() + .toString(36) + .substring(2, 7) + ); +}; + exports.exec = exec; exports.upload = upload; +exports.randid = randid; exports.git = git('./'); From aee49496bd827f048418ea4be428d16317e760b5 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Tue, 2 Jun 2020 17:23:17 +0200 Subject: [PATCH 07/15] backslashes --- bin/cml-runner-entrypoint.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-runner-entrypoint.js index 1f95aa6b1..b99a86df1 100644 --- a/bin/cml-runner-entrypoint.js +++ b/bin/cml-runner-entrypoint.js @@ -113,15 +113,15 @@ const run = async () => { GITLAB_CI_TOKEN = runner.token; - command = `gitlab-runner --log-format="json" run-single - --url "https://gitlab.com/" - --token "${runner.token}" - --executor "${RUNNER_EXECUTOR}" - --docker-runtime "${RUNNER_RUNTIME}" - --docker-image "${RUNNER_IMAGE}" - --wait-timeout ${RUNNER_IDLE_TIMEOUT} - --name "${RUNNER_NAME}" - --request-concurrency 1 + command = `gitlab-runner --log-format="json" run-single \ + --url "https://gitlab.com/" \ + --token "${runner.token}" \ + --executor "${RUNNER_EXECUTOR}" \ + --docker-runtime "${RUNNER_RUNTIME}" \ + --docker-image "${RUNNER_IMAGE}" \ + --wait-timeout ${RUNNER_IDLE_TIMEOUT} \ + --name "${RUNNER_NAME}" \ + --request-concurrency 1 \ --limit 1`; } From 6ed39f8acc4733f14c003b0fbde0541c8a7b4287 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Tue, 2 Jun 2020 17:51:35 +0200 Subject: [PATCH 08/15] remove docker publish test --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 543baae4b..c8d4c1f82 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -95,7 +95,7 @@ jobs: - name: Publish CML runner docker image # only publish if push to master (dvcorg/cml:latest) # or create a tag in the repo (dvcorg/cml:tag) - # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml From c1a34746010a3e460a13357a29c236382175fe57 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Tue, 2 Jun 2020 17:55:53 +0200 Subject: [PATCH 09/15] remove dockermachine in docker gpu --- docker/Dockerfile-gpu | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/docker/Dockerfile-gpu b/docker/Dockerfile-gpu index c9e73cf7f..79b7ac165 100644 --- a/docker/Dockerfile-gpu +++ b/docker/Dockerfile-gpu @@ -87,25 +87,3 @@ RUN apt update && \ echo /usr/local/cuda/lib64/stubs > /etc/ld.so.conf.d/z-cuda-stubs.conf && \ ldconfig # TENSORFLOW ENDS - -# DOCKER, DOCKER MACHINE, GITLAB RUNNER AND GITHUB RUNNER -ENV RUNNER_PATH=/home/runner -ENV RUNNER_ALLOW_RUNASROOT=1 - -RUN mkdir ${RUNNER_PATH} -WORKDIR ${RUNNER_PATH} - -RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ - curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ - chmod +x /usr/local/bin/docker-compose && \ - curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ - chmod +x /tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine && \ - wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64 && \ - chmod +x /usr/local/bin/gitlab-runner && \ - gitlab-runner install --user=root --working-directory=${RUNNER_PATH} && \ - wget https://github.com/actions/runner/releases/download/v2.263.0/actions-runner-linux-x64-2.263.0.tar.gz && \ - tar xzf actions-runner-linux-x64-2.263.0.tar.gz && \ - ./bin/installdependencies.sh && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -CMD ["cml-runner-entrypoint"] From cc7d542d1f8f9756eff462f2e2556f23670039d6 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Wed, 3 Jun 2020 10:20:39 +0200 Subject: [PATCH 10/15] cml self-hosted runner --- .github/workflows/publish.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c8d4c1f82..c3b51ffa3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -92,9 +92,7 @@ jobs: tag_names: true - - name: Publish CML runner docker image - # only publish if push to master (dvcorg/cml:latest) - # or create a tag in the repo (dvcorg/cml:tag) + - name: Publish CML self-hosted runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -109,7 +107,7 @@ jobs: tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-py3 runner docker image + - name: Publish cml-py3 self-hosted runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -124,7 +122,7 @@ jobs: tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-gpu runner docker image + - name: Publish cml-gpu self-hosted docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -139,7 +137,7 @@ jobs: tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-gpu-py3 runner docker image + - name: Publish cml-gpu-py3 self-hosted docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: From dd7bb8e74118c77a963249cd6d27ca0dc3f01c24 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Wed, 3 Jun 2020 20:23:59 +0200 Subject: [PATCH 11/15] cloud runner --- .github/workflows/publish.yml | 16 ++++++++-------- ...rypoint.js => cml-cloud-runner-entrypoint.js} | 0 ...Dockerfile-runner => Dockerfile-cloud-runner} | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) rename bin/{cml-runner-entrypoint.js => cml-cloud-runner-entrypoint.js} (100%) rename docker/{Dockerfile-runner => Dockerfile-cloud-runner} (97%) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c3b51ffa3..dd31ec079 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -92,7 +92,7 @@ jobs: tag_names: true - - name: Publish CML self-hosted runner docker image + - name: Publish CML cloud runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -101,13 +101,13 @@ jobs: name: dvcorg/cml username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - dockerfile: ./docker/Dockerfile + dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-py3 self-hosted runner docker image + - name: Publish cml-py3 cloud runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -116,13 +116,13 @@ jobs: name: dvcorg/cml-py3 username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - dockerfile: ./docker/Dockerfile-py3 + dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-gpu self-hosted docker image + - name: Publish cml-gpu cloud runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -131,13 +131,13 @@ jobs: name: dvcorg/cml-gpu username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - dockerfile: ./docker/Dockerfile-gpu + dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true tags: "runner" buildargs: DOCKER_FROM - - name: Publish cml-gpu-py3 self-hosted docker image + - name: Publish cml-gpu-py3 cloud runner docker image if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: @@ -146,7 +146,7 @@ jobs: name: dvcorg/cml-gpu-py3 username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - dockerfile: ./docker/Dockerfile-gpu-py3 + dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true tags: "runner" diff --git a/bin/cml-runner-entrypoint.js b/bin/cml-cloud-runner-entrypoint.js similarity index 100% rename from bin/cml-runner-entrypoint.js rename to bin/cml-cloud-runner-entrypoint.js diff --git a/docker/Dockerfile-runner b/docker/Dockerfile-cloud-runner similarity index 97% rename from docker/Dockerfile-runner rename to docker/Dockerfile-cloud-runner index 88abafecf..5bc628734 100644 --- a/docker/Dockerfile-runner +++ b/docker/Dockerfile-cloud-runner @@ -24,4 +24,4 @@ RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && \ ./bin/installdependencies.sh && \ apt-get clean && rm -rf /var/lib/apt/lists/* -CMD ["cml-runner-entrypoint"] +CMD ["cml-cloud-runner-entrypoint"] diff --git a/package.json b/package.json index 6b462bdcd..a288f202f 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "cml-setup-env-remote": "./bin/cml-setup-env-remote.js", "cml-publish": "./bin/cml-publish.js", "cml-tensorboard-dev": "./bin/cml-tensorboard-dev.js", - "cml-runner-entrypoint": "./bin/cml-runner-entrypoint.js" + "cml-cloud-runner-entrypoint": "./bin/cml-cloud-runner-entrypoint.js" }, "scripts": { "lintfix": "eslint --fix ./", From 6593beeba0ea3d48aae800251c776e1689b8ffa3 Mon Sep 17 00:00:00 2001 From: davidgortega Date: Wed, 3 Jun 2020 20:28:04 +0200 Subject: [PATCH 12/15] deploy tag runner for testing --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dd31ec079..9b0aa4a19 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -93,7 +93,7 @@ jobs: - name: Publish CML cloud runner docker image - if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml @@ -108,7 +108,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-py3 cloud runner docker image - if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-py3 @@ -123,7 +123,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-gpu cloud runner docker image - if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-gpu @@ -138,7 +138,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-gpu-py3 cloud runner docker image - if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-gpu-py3 From df463db1d000eb60411efbbff2d721ce26b5090b Mon Sep 17 00:00:00 2001 From: davidgortega Date: Wed, 3 Jun 2020 20:44:34 +0200 Subject: [PATCH 13/15] set back if dockerfile --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9b0aa4a19..dd31ec079 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -93,7 +93,7 @@ jobs: - name: Publish CML cloud runner docker image - # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml @@ -108,7 +108,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-py3 cloud runner docker image - # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-py3 @@ -123,7 +123,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-gpu cloud runner docker image - # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-gpu @@ -138,7 +138,7 @@ jobs: buildargs: DOCKER_FROM - name: Publish cml-gpu-py3 cloud runner docker image - # if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') + if: github.event_name == 'push' && (contains(github.ref, 'tags') || github.ref == 'refs/heads/master') uses: elgohr/Publish-Docker-Github-Action@master env: DOCKER_FROM: cml-gpu-py3 From 5a36bf96984c4b1705a89f191ec6d20ca863a89e Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 4 Jun 2020 11:35:25 +0200 Subject: [PATCH 14/15] docker repos --- .github/workflows/publish.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dd31ec079..0b795c9cd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -98,13 +98,13 @@ jobs: env: DOCKER_FROM: cml with: - name: dvcorg/cml + name: dvcorg/cml-cloud-runner username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true - tags: "runner" + tag_names: true buildargs: DOCKER_FROM - name: Publish cml-py3 cloud runner docker image @@ -113,13 +113,13 @@ jobs: env: DOCKER_FROM: cml-py3 with: - name: dvcorg/cml-py3 + name: dvcorg/cml-py3-cloud-runner username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true - tags: "runner" + tag_names: true buildargs: DOCKER_FROM - name: Publish cml-gpu cloud runner docker image @@ -128,13 +128,13 @@ jobs: env: DOCKER_FROM: cml-gpu with: - name: dvcorg/cml-gpu + name: dvcorg/cml-gpu-cloud-runner username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true - tags: "runner" + tag_names: true buildargs: DOCKER_FROM - name: Publish cml-gpu-py3 cloud runner docker image @@ -143,13 +143,13 @@ jobs: env: DOCKER_FROM: cml-gpu-py3 with: - name: dvcorg/cml-gpu-py3 + name: dvcorg/cml-gpu-py3-cloud-runner username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} dockerfile: ./docker/Dockerfile-cloud-runner context: ./ cache: true - tags: "runner" + tag_names: true buildargs: DOCKER_FROM - name: Publish to NPM From f8cb6cba4b54c336130c94534985d1d85ce706cd Mon Sep 17 00:00:00 2001 From: davidgortega Date: Thu, 4 Jun 2020 21:05:15 +0200 Subject: [PATCH 15/15] bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b06e2f8ec..4fc7ed34f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@dvcorg/cml", - "version": "0.1.8", + "version": "0.1.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2dccb87c0..03b10d012 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dvcorg/cml", - "version": "0.1.8", + "version": "0.1.9", "author": { "name": "DVC", "url": "http://dvc.org"