From 9e42346af2fe1a38b98e77d02b47b27ab27a269d Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:27:39 +0100 Subject: [PATCH] ci: split docker install integration tests Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .github/workflows/test.yml | 56 ++++++++++++++++++++-------- __tests__/docker/install.test.itg.ts | 52 +++++++++++++++++++------- 2 files changed, 79 insertions(+), 29 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a2e6ee00..21e8ae7e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -60,7 +60,7 @@ jobs: prepare-itg: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.tests.outputs.matrix }} + includes: ${{ steps.set.outputs.includes }} steps: - name: Checkout @@ -80,14 +80,43 @@ jobs: name: Install run: yarn install - - name: Create matrix - id: tests - run: | - declare -a tests - for test in $(yarn run test:itg-list); do - tests+=("${test#$(pwd)/__tests__/}") - done - echo "matrix=$(echo ${tests[@]} | jq -cR 'split(" ")')" >>${GITHUB_OUTPUT} + name: Create includes + id: set + uses: actions/github-script@v7 + with: + script: | + let tests = []; + await core.group(`Get tests`, async () => { + const res = await exec.getExecOutput('yarn', ['run', 'test:itg-list'], { + silent: true, + ignoreReturnCode: true + }); + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(res.stderr); + } + for (const test of res.stdout.trim().split('\n')) { + tests.push(test.replace(/^.*__tests__\//, '')); + } + core.info(`tests: ${JSON.stringify(tests)}`); + }); + await core.group(`Set includes`, async () => { + let includes = []; + for (const os of ['ubuntu-latest', 'macos-13', 'windows-latest']) { + for (const test of tests) { + if (os === 'macos-13' && test === 'docker/install.test.itg.ts') { + includes.push({ os: os, test: test, docker_install_type: 'image', docker_install_version: '27.3.1' }); + includes.push({ os: os, test: test, docker_install_type: 'image', docker_install_version: 'master' }); + includes.push({ os: os, test: test, docker_install_type: 'image', docker_install_version: 'latest' }); + includes.push({ os: os, test: test, docker_install_type: 'archive', docker_install_version: 'v26.1.4' }); + includes.push({ os: os, test: test, docker_install_type: 'archive', docker_install_version: 'latest' }); + } else { + includes.push({ os: os, test: test }); + } + } + } + core.info(`includes: ${JSON.stringify(includes)}`); + core.setOutput('includes', JSON.stringify(includes)); + }); - name: Show matrix run: | @@ -100,12 +129,7 @@ jobs: strategy: fail-fast: false matrix: - test: ${{ fromJson(needs.prepare-itg.outputs.matrix) }} - os: - - ubuntu-latest - #- macos-14 # no virt: https://github.com/docker/actions-toolkit/issues/317 - - macos-13 - - windows-latest + include: ${{ fromJson(needs.prepare-itg.outputs.includes) }} steps: - name: Checkout @@ -158,6 +182,8 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CTN_BUILDER_NAME: ${{ steps.builder.outputs.name }} TEST_FOR_SUMMARY: ${{ secrets.TEST_FOR_SUMMARY }} + DOCKER_INSTALL_TYPE: ${{ matrix.docker_install_type }} + DOCKER_INSTALL_VERSION: ${{ matrix.docker_install_version }} - name: Check coverage run: | diff --git a/__tests__/docker/install.test.itg.ts b/__tests__/docker/install.test.itg.ts index 00cdb97f..592ec9e4 100644 --- a/__tests__/docker/install.test.itg.ts +++ b/__tests__/docker/install.test.itg.ts @@ -19,21 +19,15 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; -import {Install, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install'; +import {Install, InstallSource, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install'; import {Docker} from '../../src/docker/docker'; import {Exec} from '../../src/exec'; const tmpDir = () => fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'docker-install-itg-')); -describe('install', () => { +describe('root', () => { // prettier-ignore - test.each([ - {type: 'image', tag: '27.3.1'} as InstallSourceImage, - {type: 'image', tag: 'master'} as InstallSourceImage, - {type: 'image', tag: 'latest'} as InstallSourceImage, - {type: 'archive', version: 'v26.1.4', channel: 'stable'} as InstallSourceArchive, - {type: 'archive', version: 'latest', channel: 'stable'} as InstallSourceArchive, - ])( + test.each(getSources(true))( 'install docker %s', async (source) => { await ensureNoSystemContainerd(); const install = new Install({ @@ -48,16 +42,12 @@ describe('install', () => { describe('rootless', () => { // prettier-ignore - test.each([ - {type: 'image', tag: 'latest'} as InstallSourceImage, - {type: 'archive', version: 'latest', channel: 'stable'} as InstallSourceArchive, - ])( + test.each(getSources(false))( 'install %s', async (source) => { // Skip on non linux if (os.platform() !== 'linux') { return; } - await ensureNoSystemContainerd(); const install = new Install({ source: source, @@ -109,3 +99,37 @@ async function ensureNoSystemContainerd() { }); } } + +function getSources(root: boolean): Array { + const dockerInstallType = process.env.DOCKER_INSTALL_TYPE; + const dockerInstallVersion = process.env.DOCKER_INSTALL_VERSION; + if (dockerInstallType && dockerInstallVersion) { + if (dockerInstallType === 'archive') { + // prettier-ignore + return [ + { type: dockerInstallType, version: dockerInstallVersion, channel: 'stable'} as InstallSourceArchive + ]; + } else { + // prettier-ignore + return [ + { type: dockerInstallType, tag: dockerInstallVersion} as InstallSourceImage + ]; + } + } + if (root) { + // prettier-ignore + return [ + {type: 'image', tag: '27.3.1'} as InstallSourceImage, + {type: 'image', tag: 'master'} as InstallSourceImage, + {type: 'image', tag: 'latest'} as InstallSourceImage, + {type: 'archive', version: 'v26.1.4', channel: 'stable'} as InstallSourceArchive, + {type: 'archive', version: 'latest', channel: 'stable'} as InstallSourceArchive + ]; + } else { + // prettier-ignore + return [ + {type: 'image', tag: 'latest'} as InstallSourceImage, + {type: 'archive', version: 'latest', channel: 'stable'} as InstallSourceArchive + ]; + } +}