Fix working directory and write state for appPod to be used in run-script-step (#8)

* added initial entrypoint script

* change workingg directory working with addition to fix prepare-job state output

* added prepend path

* added run-script-step file generation, removed prepend path from container-step and prepare job

* latest changes with testing run script step

* fix the mounts real fast

* cleanup

* fix tests

* add kind test

* add kind yaml to ignore and run it during ci

* fix kind option

* remove gitignore

* lowercase pwd

* checkout first!

* ignore test file in build.yaml

* fixed wrong working directory and added test to run script step testing for the env

* handle env's/escaping better

* added single quote escape to env escapes

* surounded env value with single quote

* added spacing around run-container-step, changed examples to actually echo hello world

* refactored tests

* make sure to escape properly

* set addition mounts for container steps

* fixup container action mounts

Co-authored-by: Thomas Boop <thboop@github.com>
Co-authored-by: Thomas Boop <52323235+thboop@users.noreply.github.com>
This commit is contained in:
Nikola Jokic
2022-06-15 03:41:49 +02:00
committed by GitHub
parent 643bf36fd8
commit 8ea57170d8
23 changed files with 391 additions and 230 deletions

View File

@@ -1,4 +1,4 @@
import * as fs from 'fs'
import { PrepareJobArgs } from 'hooklib/lib'
import { cleanupJob, prepareJob } from '../src/hooks'
import TestSetup from './test-setup'
@@ -11,22 +11,16 @@ describe('cleanup job', () => {
testSetup = new TestSetup()
testSetup.initialize()
const prepareJobDefinition = JSON.parse(
fs.readFileSync(
`${__dirname}/../../../examples/prepare-job.json`,
'utf-8'
)
)
const prepareJobDefinition = testSetup.getPrepareJobDefinition()
const prepareJobOutput = testSetup.createOutputFile(
'prepare-job-output.json'
)
prepareJobDefinition.args.container.registry = null
prepareJobDefinition.args.services.forEach(s => {
s.registry = null
})
await prepareJob(prepareJobDefinition.args, prepareJobOutput)
await prepareJob(
prepareJobDefinition.args as PrepareJobArgs,
prepareJobOutput
)
})
afterEach(() => {

View File

@@ -1,24 +1,15 @@
import * as fs from 'fs'
import { containerBuild } from '../src/dockerCommands'
import TestSetup from './test-setup'
let testSetup
let runContainerStepDefinition
const runContainerStepInputPath = `${__dirname}/../../../examples/run-container-step.json`
describe('container build', () => {
beforeEach(() => {
testSetup = new TestSetup()
testSetup.initialize()
let runContainerStepJson = fs.readFileSync(
runContainerStepInputPath,
'utf8'
)
runContainerStepDefinition = JSON.parse(runContainerStepJson.toString())
runContainerStepDefinition.image = ''
const actionPath = testSetup.initializeDockerAction()
runContainerStepDefinition.dockerfile = `${actionPath}/Dockerfile`
runContainerStepDefinition = testSetup.getRunContainerStepDefinition()
})
afterEach(() => {
@@ -26,6 +17,9 @@ describe('container build', () => {
})
it('should build container', async () => {
runContainerStepDefinition.image = ''
const actionPath = testSetup.initializeDockerAction()
runContainerStepDefinition.dockerfile = `${actionPath}/Dockerfile`
await expect(
containerBuild(runContainerStepDefinition, 'example-test-tag')
).resolves.not.toThrow()

View File

@@ -1,5 +1,4 @@
import * as fs from 'fs'
import * as path from 'path'
import {
cleanupJob,
prepareJob,
@@ -8,28 +7,7 @@ import {
} from '../src/hooks'
import TestSetup from './test-setup'
const definitions = {
prepareJob: JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/prepare-job.json'),
'utf8'
)
),
runContainerStep: JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/run-container-step.json'),
'utf8'
)
),
runScriptStep: JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/run-script-step.json'),
'utf-8'
)
)
}
let definitions
let testSetup: TestSetup
@@ -37,12 +15,12 @@ describe('e2e', () => {
beforeEach(() => {
testSetup = new TestSetup()
testSetup.initialize()
definitions.prepareJob.args.container.systemMountVolumes =
testSetup.systemMountVolumes
definitions.prepareJob.args.container.registry = null
definitions.prepareJob.args.services.forEach(s => {
s.registry = null
})
definitions = {
prepareJob: testSetup.getPrepareJobDefinition(),
runScriptStep: testSetup.getRunScriptStepDefinition(),
runContainerStep: testSetup.getRunContainerStepDefinition()
}
})
afterEach(() => {

View File

@@ -4,9 +4,7 @@ import TestSetup from './test-setup'
jest.useRealTimers()
const prepareJobDefinition = JSON.parse(
fs.readFileSync(`${__dirname}/../../../examples/prepare-job.json`, 'utf-8')
)
let prepareJobDefinition
let testSetup: TestSetup
@@ -14,15 +12,7 @@ describe('prepare job', () => {
beforeEach(() => {
testSetup = new TestSetup()
testSetup.initialize()
prepareJobDefinition.args.container.systemMountVolumes =
testSetup.systemMountVolumes
prepareJobDefinition.args.container.workingDirectory =
testSetup.workingDirectory
prepareJobDefinition.args.container.registry = null
prepareJobDefinition.args.services.forEach(s => {
s.registry = null
})
prepareJobDefinition = testSetup.getPrepareJobDefinition()
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
import * as fs from 'fs'
import { PrepareJobResponse } from 'hooklib/lib'
import * as path from 'path'
import { prepareJob, runScriptStep } from '../src/hooks'
import TestSetup from './test-setup'
@@ -8,36 +7,23 @@ jest.useRealTimers()
let testSetup: TestSetup
const definitions = {
prepareJob: JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/prepare-job.json'),
'utf8'
)
),
runScriptStep: JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/run-script-step.json'),
'utf-8'
)
)
}
let definitions
let prepareJobResponse: PrepareJobResponse
describe('run-script-step', () => {
describe('run script step', () => {
beforeEach(async () => {
testSetup = new TestSetup()
testSetup.initialize()
definitions = {
prepareJob: testSetup.getPrepareJobDefinition(),
runScriptStep: testSetup.getRunScriptStepDefinition()
}
const prepareJobOutput = testSetup.createOutputFile(
'prepare-job-output.json'
)
definitions.prepareJob.args.container.registry = null
definitions.prepareJob.args.services.forEach(s => {
s.registry = null
})
await prepareJob(definitions.prepareJob.args, prepareJobOutput)
prepareJobResponse = JSON.parse(fs.readFileSync(prepareJobOutput, 'utf-8'))

View File

@@ -1,5 +1,6 @@
import * as fs from 'fs'
import { Mount } from 'hooklib'
import { HookData } from 'hooklib/lib'
import * as path from 'path'
import { env } from 'process'
import { v4 as uuidv4 } from 'uuid'
@@ -51,13 +52,18 @@ export default class TestSetup {
for (const dir of this.allTestDirectories) {
fs.mkdirSync(dir, { recursive: true })
}
fs.copyFileSync(
path.resolve(`${__dirname}/../../../examples/example-script.sh`),
`${env.RUNNER_TEMP}/example-script.sh`
)
}
public teardown(): void {
fs.rmdirSync(this.testdir, { recursive: true })
}
public get systemMountVolumes(): Mount[] {
private get systemMountVolumes(): Mount[] {
return [
{
sourceVolumePath: '/var/run/docker.sock',
@@ -140,4 +146,51 @@ echo "::set-output name=time::$time"`
fs.writeFileSync(entryPointPath, content)
fs.chmodSync(entryPointPath, 0o755)
}
public getPrepareJobDefinition(): HookData {
const prepareJob = JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/prepare-job.json'),
'utf8'
)
)
prepareJob.args.container.systemMountVolumes = this.systemMountVolumes
prepareJob.args.container.workingDirectory = this.workingDirectory
prepareJob.args.container.userMountVolumes = undefined
prepareJob.args.container.registry = null
prepareJob.args.services.forEach(s => {
s.registry = null
})
return prepareJob
}
public getRunScriptStepDefinition(): HookData {
const runScriptStep = JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/run-script-step.json'),
'utf8'
)
)
runScriptStep.args.entryPointArgs[1] = `/__w/_temp/example-script.sh`
return runScriptStep
}
public getRunContainerStepDefinition(): HookData {
const runContainerStep = JSON.parse(
fs.readFileSync(
path.resolve(__dirname + '/../../../examples/run-container-step.json'),
'utf8'
)
)
runContainerStep.args.entryPointArgs[1] = `/__w/_temp/example-script.sh`
runContainerStep.args.systemMountVolumes = this.systemMountVolumes
runContainerStep.args.workingDirectory = this.workingDirectory
runContainerStep.args.userMountVolumes = undefined
runContainerStep.args.registry = null
return runContainerStep
}
}