mirror of
https://github.com/actions/runner-container-hooks.git
synced 2025-12-13 16:16:46 +00:00
* added cleanup job checks, started testing constants file * added getVolumeClaimName test * added write entrypoint tests * added tests around k8s utils * fixed new regexp * added tests around runner instance label * 100% test coverage of constants
154 lines
4.6 KiB
TypeScript
154 lines
4.6 KiB
TypeScript
import * as fs from 'fs'
|
|
import { POD_VOLUME_NAME } from '../src/k8s'
|
|
import { containerVolumes, writeEntryPointScript } from '../src/k8s/utils'
|
|
import { TestHelper } from './test-setup'
|
|
|
|
let testHelper: TestHelper
|
|
|
|
describe('k8s utils', () => {
|
|
describe('write entrypoint', () => {
|
|
beforeEach(async () => {
|
|
testHelper = new TestHelper()
|
|
await testHelper.initialize()
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await testHelper.cleanup()
|
|
})
|
|
|
|
it('should not throw', () => {
|
|
expect(() =>
|
|
writeEntryPointScript(
|
|
'/test',
|
|
'sh',
|
|
['-e', 'script.sh'],
|
|
['/prepend/path'],
|
|
{
|
|
SOME_ENV: 'SOME_VALUE'
|
|
}
|
|
)
|
|
).not.toThrow()
|
|
})
|
|
|
|
it('should throw if RUNNER_TEMP is not set', () => {
|
|
delete process.env.RUNNER_TEMP
|
|
expect(() =>
|
|
writeEntryPointScript(
|
|
'/test',
|
|
'sh',
|
|
['-e', 'script.sh'],
|
|
['/prepend/path'],
|
|
{
|
|
SOME_ENV: 'SOME_VALUE'
|
|
}
|
|
)
|
|
).toThrow()
|
|
})
|
|
|
|
it('should return object with containerPath and runnerPath', () => {
|
|
const { containerPath, runnerPath } = writeEntryPointScript(
|
|
'/test',
|
|
'sh',
|
|
['-e', 'script.sh'],
|
|
['/prepend/path'],
|
|
{
|
|
SOME_ENV: 'SOME_VALUE'
|
|
}
|
|
)
|
|
expect(containerPath).toMatch(/\/__w\/_temp\/.*\.sh/)
|
|
const re = new RegExp(`${process.env.RUNNER_TEMP}/.*\\.sh`)
|
|
expect(runnerPath).toMatch(re)
|
|
})
|
|
|
|
it('should write entrypoint path and the file should exist', () => {
|
|
const { runnerPath } = writeEntryPointScript(
|
|
'/test',
|
|
'sh',
|
|
['-e', 'script.sh'],
|
|
['/prepend/path'],
|
|
{
|
|
SOME_ENV: 'SOME_VALUE'
|
|
}
|
|
)
|
|
expect(fs.existsSync(runnerPath)).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('container volumes', () => {
|
|
beforeEach(async () => {
|
|
testHelper = new TestHelper()
|
|
await testHelper.initialize()
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await testHelper.cleanup()
|
|
})
|
|
|
|
it('should throw if container action and GITHUB_WORKSPACE env is not set', () => {
|
|
delete process.env.GITHUB_WORKSPACE
|
|
expect(() => containerVolumes([], true, true)).toThrow()
|
|
expect(() => containerVolumes([], false, true)).toThrow()
|
|
})
|
|
|
|
it('should always have work mount', () => {
|
|
let volumes = containerVolumes([], true, true)
|
|
expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy()
|
|
volumes = containerVolumes([], true, false)
|
|
expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy()
|
|
volumes = containerVolumes([], false, true)
|
|
expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy()
|
|
volumes = containerVolumes([], false, false)
|
|
expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy()
|
|
})
|
|
|
|
it('should have container action volumes', () => {
|
|
let volumes = containerVolumes([], true, true)
|
|
expect(
|
|
volumes.find(e => e.mountPath === '/github/workspace')
|
|
).toBeTruthy()
|
|
expect(
|
|
volumes.find(e => e.mountPath === '/github/file_commands')
|
|
).toBeTruthy()
|
|
volumes = containerVolumes([], false, true)
|
|
expect(
|
|
volumes.find(e => e.mountPath === '/github/workspace')
|
|
).toBeTruthy()
|
|
expect(
|
|
volumes.find(e => e.mountPath === '/github/file_commands')
|
|
).toBeTruthy()
|
|
})
|
|
|
|
it('should have externals, github home and github workflow mounts if job container', () => {
|
|
const volumes = containerVolumes()
|
|
expect(volumes.find(e => e.mountPath === '/__e')).toBeTruthy()
|
|
expect(volumes.find(e => e.mountPath === '/github/home')).toBeTruthy()
|
|
expect(volumes.find(e => e.mountPath === '/github/workflow')).toBeTruthy()
|
|
})
|
|
|
|
it('should throw if user volume source volume path is not in workspace', () => {
|
|
expect(() =>
|
|
containerVolumes(
|
|
[
|
|
{
|
|
sourceVolumePath: '/outside/of/workdir'
|
|
}
|
|
],
|
|
true,
|
|
false
|
|
)
|
|
).toThrow()
|
|
})
|
|
|
|
it(`all volumes should have name ${POD_VOLUME_NAME}`, () => {
|
|
let volumes = containerVolumes([], true, true)
|
|
expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy()
|
|
volumes = containerVolumes([], true, false)
|
|
expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy()
|
|
volumes = containerVolumes([], false, true)
|
|
expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy()
|
|
volumes = containerVolumes([], false, false)
|
|
expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy()
|
|
})
|
|
})
|
|
})
|