Files

196 lines
5.6 KiB
TypeScript
Raw Permalink Normal View History

2022-06-02 15:53:11 -04:00
import * as fs from 'fs'
import { Mount } from 'hooklib'
import { HookData } from 'hooklib/lib'
2022-06-08 13:20:54 +02:00
import * as path from 'path'
import { env } from 'process'
import { v4 as uuidv4 } from 'uuid'
2022-06-02 15:53:11 -04:00
export default class TestSetup {
private testdir: string
private runnerMockDir: string
2022-06-08 13:20:54 +02:00
readonly runnerOutputDir: string
2022-06-02 15:53:11 -04:00
private runnerMockSubdirs = {
work: '_work',
externals: 'externals',
workTemp: '_work/_temp',
workActions: '_work/_actions',
workTool: '_work/_tool',
githubHome: '_work/_temp/_github_home',
githubWorkflow: '_work/_temp/_github_workflow'
}
2022-06-08 13:20:54 +02:00
private readonly projectName = 'repo'
2022-06-02 15:53:11 -04:00
constructor() {
this.testdir = `${__dirname}/_temp/${uuidv4()}`
this.runnerMockDir = `${this.testdir}/runner/_layout`
2022-06-08 13:20:54 +02:00
this.runnerOutputDir = `${this.testdir}/outputs`
2022-06-02 15:53:11 -04:00
}
private get allTestDirectories() {
2022-06-08 13:20:54 +02:00
const resp = [this.testdir, this.runnerMockDir, this.runnerOutputDir]
2022-06-02 15:53:11 -04:00
2025-07-29 11:06:45 +02:00
for (const [, value] of Object.entries(this.runnerMockSubdirs)) {
2022-06-02 15:53:11 -04:00
resp.push(`${this.runnerMockDir}/${value}`)
}
resp.push(
`${this.runnerMockDir}/_work/${this.projectName}/${this.projectName}`
)
2022-06-02 15:53:11 -04:00
return resp
}
2025-07-29 11:06:45 +02:00
initialize(): void {
2022-06-08 13:20:54 +02:00
env['GITHUB_WORKSPACE'] = this.workingDirectory
2022-06-02 15:53:11 -04:00
env['RUNNER_NAME'] = 'test'
2025-07-29 11:06:45 +02:00
env['RUNNER_TEMP'] =
`${this.runnerMockDir}/${this.runnerMockSubdirs.workTemp}`
2022-06-08 13:20:54 +02:00
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`
)
2022-06-02 15:53:11 -04:00
}
2025-07-29 11:06:45 +02:00
teardown(): void {
2022-06-02 15:53:11 -04:00
fs.rmdirSync(this.testdir, { recursive: true })
}
private get systemMountVolumes(): Mount[] {
2022-06-02 15:53:11 -04:00
return [
{
sourceVolumePath: '/var/run/docker.sock',
targetVolumePath: '/var/run/docker.sock',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.work}`,
targetVolumePath: '/__w',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.externals}`,
targetVolumePath: '/__e',
readOnly: true
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.workTemp}`,
targetVolumePath: '/__w/_temp',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.workActions}`,
targetVolumePath: '/__w/_actions',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.workTool}`,
targetVolumePath: '/__w/_tool',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.githubHome}`,
targetVolumePath: '/github/home',
readOnly: false
},
{
sourceVolumePath: `${this.runnerMockDir}/${this.runnerMockSubdirs.githubWorkflow}`,
targetVolumePath: '/github/workflow',
readOnly: false
}
]
}
2025-07-29 11:06:45 +02:00
createOutputFile(name: string): string {
2022-06-08 13:20:54 +02:00
let filePath = path.join(this.runnerOutputDir, name || `${uuidv4()}.json`)
fs.writeFileSync(filePath, '')
return filePath
}
2025-07-29 11:06:45 +02:00
get workingDirectory(): string {
2022-06-08 13:20:54 +02:00
return `${this.runnerMockDir}/_work/${this.projectName}/${this.projectName}`
}
2025-07-29 11:06:45 +02:00
get containerWorkingDirectory(): string {
2022-06-02 15:53:11 -04:00
return `/__w/${this.projectName}/${this.projectName}`
}
2025-07-29 11:06:45 +02:00
initializeDockerAction(): string {
const actionPath = `${this.testdir}/_actions/example-handle/example-repo/example-branch/mock-directory`
fs.mkdirSync(actionPath, { recursive: true })
this.writeDockerfile(actionPath)
this.writeEntrypoint(actionPath)
return actionPath
}
private writeDockerfile(actionPath: string) {
const content = `FROM alpine:3.10
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]`
fs.writeFileSync(`${actionPath}/Dockerfile`, content)
}
private writeEntrypoint(actionPath) {
const content = `#!/bin/sh -l
echo "Hello $1"
time=$(date)
echo "::set-output name=time::$time"`
const entryPointPath = `${actionPath}/entrypoint.sh`
fs.writeFileSync(entryPointPath, content)
fs.chmodSync(entryPointPath, 0o755)
}
2025-07-29 11:06:45 +02:00
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
}
2025-07-29 11:06:45 +02:00
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
}
2025-07-29 11:06:45 +02:00
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
}
2022-06-02 15:53:11 -04:00
}