diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index d7a8789..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Continuous Integration - -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - -permissions: - contents: read - -jobs: - test-javascript: - name: JavaScript Tests - runs-on: ubuntu-latest - - steps: - - name: Checkout - id: checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - - - name: Setup Node.js - id: setup-node - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af - with: - node-version-file: .node-version - cache: npm - - - name: Install Dependencies - id: npm-ci - run: npm ci - - - name: Check Format - id: npm-format-check - run: npm run format:check - - - name: Lint - id: npm-lint - run: npm run lint - - - name: Test - id: npm-ci-test - run: npm run ci-test - - test-action: - name: GitHub Actions Test - runs-on: ubuntu-latest - strategy: - matrix: - provider: [ aws, hyperstack ] - fail-fast: false - steps: - - name: Checkout - id: checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - - - name: Test start instance - id: test-start - uses: ./ - with: - mode: start - github-token: ${{ secrets.SLAB_ACTION_TOKEN }} - slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} - job-secret: ${{ secrets.JOB_SECRET }} - backend: ${{ matrix.provider }} - profile: ci-test - - - name: Test stop instance - id: test-stop - if: ${{ always() }} - uses: ./ - with: - mode: stop - github-token: ${{ secrets.SLAB_ACTION_TOKEN }} - slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} - job-secret: ${{ secrets.JOB_SECRET }} - label: ${{ steps.test-start.outputs.label }} diff --git a/.github/workflows/registered_runner.yml b/.github/workflows/registered_runner.yml new file mode 100644 index 0000000..5d1bb10 --- /dev/null +++ b/.github/workflows/registered_runner.yml @@ -0,0 +1,19 @@ +# This simple workflow is used to test if a runner is registered on GitHub platform. +name: Test registered runner + +on: + workflow_call: + inputs: + runner-name: + required: true + type: string + +jobs: + test-runner: + name: Test Runner + runs-on: ${{ inputs.runner-name }} + timeout-minutes: 5 # Job should be picked very quickly + steps: + - name: Runner registered + run: | + echo "Runner name: $ {{ inputs.runner-name }}" diff --git a/.github/workflows/removed_runner.yml b/.github/workflows/removed_runner.yml new file mode 100644 index 0000000..ff6ea29 --- /dev/null +++ b/.github/workflows/removed_runner.yml @@ -0,0 +1,37 @@ +# This simple workflow is used to test if a runner is removed from GitHub platform. +name: Test registered runner + +on: + workflow_call: + inputs: + runner-name: + required: true + type: string + must-exist: + type: boolean + default: false + secrets: + READ_REPO_TOKEN: + required: true + +jobs: + test-removed-runner: + name: Test Removed Runner + runs-on: ubuntu-latest + + steps: + - name: List runners + run: | + echo "RUNNERS_FOUND=$(gh api "repos/zama-ai/slab-github-runner/actions/runners" --jq '.runners[].name')" >> "${GITHUB_ENV}" + env: + GH_TOKEN: ${{ secrets.READ_REPO_TOKEN }} + + - name: Check runner removed + if: inputs.must-exist == false + run: | + ( echo "${{ env.RUNNERS_FOUND }}" | grep --line-regexp -q "${{ inputs.runner-name }}" ) && { exit 1; } || exit 0 + + - name: Check runner persists + if: inputs.must-exist == true + run: | + ( echo "${{ env.RUNNERS_FOUND }}" | grep --line-regexp -q "${{ inputs.runner-name }}" ) || exit 1 diff --git a/.github/workflows/test_javascript.yml b/.github/workflows/test_javascript.yml new file mode 100644 index 0000000..a041458 --- /dev/null +++ b/.github/workflows/test_javascript.yml @@ -0,0 +1,44 @@ +name: Test Javascript + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + test-javascript: + name: JavaScript Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout + id: checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + + - name: Setup Node.js + id: setup-node + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + with: + node-version-file: .node-version + cache: npm + + - name: Install Dependencies + id: npm-ci + run: npm ci + + - name: Check Format + id: npm-format-check + run: npm run format:check + + - name: Lint + id: npm-lint + run: npm run lint + + - name: Test + id: npm-ci-test + run: npm run ci-test diff --git a/.github/workflows/test_spawn_terminate.yml b/.github/workflows/test_spawn_terminate.yml new file mode 100644 index 0000000..57acc76 --- /dev/null +++ b/.github/workflows/test_spawn_terminate.yml @@ -0,0 +1,83 @@ +# Test action to spawn/terminate backend instance +name: Test Spawn-Terminate + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + action-start: + name: GitHub Actions Test (spawn) + runs-on: ubuntu-latest + strategy: + matrix: + provider: [ aws, hyperstack ] + fail-fast: false + outputs: + runner-aws: ${{ steps.gen-output.outputs.runner_aws }} + runner-hyperstack: ${{ steps.gen-output.outputs.runner_hyperstack }} + steps: + - name: Checkout + id: checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + + - name: Test start instance + id: test-start + uses: ./ + with: + mode: start + github-token: ${{ secrets.SLAB_ACTION_TOKEN }} + slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} + job-secret: ${{ secrets.JOB_SECRET }} + backend: ${{ matrix.provider }} + profile: ci-test + + - name: Generate output + id: gen-output + run: | + echo "runner_${{ matrix.provider }}=${{ steps.test-start.outputs.label }}" >> "${GITHUB_OUTPUT}" + + test-runner-alive-aws: + name: Test runner is alive (AWS) + needs: [ action-start ] + uses: ./.github/workflows/registered_runner.yml + with: + runner-name: ${{ needs.action-start.outputs.runner-aws }} + + test-runner-alive-hyperstack: + name: Test runner is alive (Hyperstack) + needs: [ action-start ] + uses: ./.github/workflows/registered_runner.yml + with: + runner-name: ${{ needs.action-start.outputs.runner-hyperstack }} + + action-stop: + name: GitHub Actions Test (terminate) + runs-on: ubuntu-latest + needs: [ action-start, test-runner-alive-aws, test-runner-alive-hyperstack ] + if: ${{ always() && needs.action-start.result != 'skipped' }} + strategy: + matrix: + runner: [ "${{ needs.action-start.outputs.runner-aws }}", + "${{ needs.action-start.outputs.runner-hyperstack }}" ] + fail-fast: false + steps: + - name: Checkout + id: checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + + - name: Test stop instance + id: test-stop + uses: ./ + with: + mode: stop + github-token: ${{ secrets.SLAB_ACTION_TOKEN }} + slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} + job-secret: ${{ secrets.JOB_SECRET }} + label: ${{ matrix.runner }} diff --git a/.github/workflows/test_start_stop.yml b/.github/workflows/test_start_stop.yml new file mode 100644 index 0000000..c054624 --- /dev/null +++ b/.github/workflows/test_start_stop.yml @@ -0,0 +1,79 @@ +# Test action to start/stop already provisioned backend instance. +name: Test Start-Stop + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + test-runner-exist: + name: Test runner is registered + uses: ./.github/workflows/removed_runner.yml + with: + runner-name: ci-persistent-runner + must-exist: true + secrets: + READ_REPO_TOKEN: ${{ secrets.SLAB_ACTION_TOKEN }} + + action-start: + name: GitHub Actions Test (start) + runs-on: ubuntu-latest + needs: [ test-runner-exist ] + steps: + - name: Checkout + id: checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + + - name: Test start instance + id: test-start + uses: ./ + with: + mode: start + github-token: ${{ secrets.SLAB_ACTION_TOKEN }} + slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} + job-secret: ${{ secrets.JOB_SECRET }} + backend: aws + profile: ci-test-start-stop + + test-runner-alive: + name: Test runner is alive + needs: [ action-start ] + uses: ./.github/workflows/registered_runner.yml + with: + runner-name: ci-persistent-runner + + action-stop: + name: GitHub Actions Test (stop) + runs-on: ubuntu-latest + needs: [ action-start, test-runner-alive ] + if: ${{ always() && needs.action-start.result != 'skipped' }} + steps: + - name: Checkout + id: checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + + - name: Test stop instance + id: test-stop + uses: ./ + with: + mode: stop + github-token: ${{ secrets.SLAB_ACTION_TOKEN }} + slab-url: ${{ secrets.SLAB_BASE_URL_PRE_PROD }} + job-secret: ${{ secrets.JOB_SECRET }} + label: ci-persistent-runner + + test-runner-persist: + name: Test runner is still registered + needs: [ action-stop ] + uses: ./.github/workflows/removed_runner.yml + with: + runner-name: ci-persistent-runner + must-exist: true + secrets: + READ_REPO_TOKEN: ${{ secrets.SLAB_ACTION_TOKEN }} diff --git a/ci/slab.toml b/ci/slab.toml index 513defe..5941f70 100644 --- a/ci/slab.toml +++ b/ci/slab.toml @@ -6,6 +6,14 @@ image_id = "ami-01d21b7be69801c2f" # Ubuntu 22.04 instance_type = "t3.2xlarge" user = "ubuntu" +# This instance is a persistent one with a runner already registered +[backend.aws.ci-test-start-stop] +region = "eu-west-3" +image_id = "ami-01d21b7be69801c2f" # Ubuntu 22.04 +instance_type = "t3.2xlarge" +instance_id = "i-042a592f53f5ab592" +runner_name = "ci-persistent-runner" + [backend.hyperstack.ci-test] environment_name = "canada" image_name = "Ubuntu Server 22.04 LTS R535 CUDA 12.2" diff --git a/dist/index.js b/dist/index.js index ea7be2e..b535055 100644 --- a/dist/index.js +++ b/dist/index.js @@ -49653,7 +49653,7 @@ async function getRunner(label) { repo: config.githubContext.repo } ) - const foundRunners = _.filter(runners, { labels: [{ name: label }] }) + const foundRunners = _.filter(runners, { name: label }) return foundRunners.length > 0 ? foundRunners[0] : null } catch (error) { return null @@ -49671,7 +49671,7 @@ async function waitForRunnerRegistered(label) { ) await utils.sleep(quietPeriodSeconds) core.info( - `Checking every ${retryIntervalSeconds}s if the GitHub self-hosted runner is registered` + `Checking every ${retryIntervalSeconds}s if the GitHub self-hosted runner is registered (runner: ${label})` ) while (waitSeconds < timeoutSeconds) { @@ -51877,7 +51877,7 @@ async function stop() { ) await slab.waitForInstance(stop_instance_response.task_id, 'stop') - core.info('Instance sucessfully terminated') + core.info('Instance successfully terminated') } async function run() { diff --git a/src/gh.js b/src/gh.js index 0f1455e..ab50d9d 100644 --- a/src/gh.js +++ b/src/gh.js @@ -17,7 +17,7 @@ async function getRunner(label) { repo: config.githubContext.repo } ) - const foundRunners = _.filter(runners, { labels: [{ name: label }] }) + const foundRunners = _.filter(runners, { name: label }) return foundRunners.length > 0 ? foundRunners[0] : null } catch (error) { return null @@ -35,7 +35,7 @@ async function waitForRunnerRegistered(label) { ) await utils.sleep(quietPeriodSeconds) core.info( - `Checking every ${retryIntervalSeconds}s if the GitHub self-hosted runner is registered` + `Checking every ${retryIntervalSeconds}s if the GitHub self-hosted runner is registered (runner: ${label})` ) while (waitSeconds < timeoutSeconds) { diff --git a/src/index.js b/src/index.js index 145c921..c3ec1d9 100644 --- a/src/index.js +++ b/src/index.js @@ -29,7 +29,7 @@ async function stop() { ) await slab.waitForInstance(stop_instance_response.task_id, 'stop') - core.info('Instance sucessfully terminated') + core.info('Instance successfully terminated') } async function run() {