Run script in GITHUB_WORKSPACE directory

Change to the GITHUB_WORKSPACE directory before running the script so
that callers do not have to exlicitly use the GITHUB_WORKSPACE
environment variable when requiring script files.

Workflow run steps are run within the GITHUB_WORKSPACE so this seems
like the expected default.
This commit is contained in:
Rob Young 2021-02-22 11:02:45 +00:00
parent f05a81df23
commit 7dc493a321
4 changed files with 73 additions and 6 deletions

View file

@ -243,11 +243,12 @@ jobs:
- uses: actions/github-script@v3
with:
script: |
const script = require(`${process.env.GITHUB_WORKSPACE}/path/to/script.js`)
const script = require(`./path/to/script.js`)
console.log(script({github, context}))
```
_Note that the script path given to `require()` must be an **absolute path** in this case, hence using [`GITHUB_WORKSPACE`](https://docs.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables)._
The script will be run within the [`GITHUB_WORKSPACE`](https://docs.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables)
directory.
And then export a function from your module:

View file

@ -25,4 +25,48 @@ describe('callAsyncFunction', () => {
test('can access console', async () => {
await callAsyncFunction({} as any, 'console')
})
describe('change directory', () => {
const MOCK_CWD = '/path/to/action'
const MOCK_GITHUB_WORKSPACE = '/path/to/code'
const PREV_GITHUB_WORKSPACE = process.env.GITHUB_WORKSPACE
let chdir: jest.SpyInstance
beforeEach(() => {
jest.resetModules()
jest.clearAllMocks()
let cwd = MOCK_CWD
chdir = jest.spyOn(process, 'chdir').mockImplementation(directory => {
cwd = directory
})
jest.spyOn(process, 'cwd').mockImplementation(() => {
return cwd
})
})
afterAll(() => {
process.env.GITHUB_WORKSPACE = PREV_GITHUB_WORKSPACE
})
test('changes to GITHUB_WORKSPACE if environment variable is set', async () => {
process.env.GITHUB_WORKSPACE = MOCK_GITHUB_WORKSPACE
await callAsyncFunction({} as any, 'process')
expect(chdir.mock.calls.length).toBe(2)
expect(chdir.mock.calls[0][0]).toBe(MOCK_GITHUB_WORKSPACE)
expect(chdir.mock.calls[1][0]).toBe(MOCK_CWD)
})
test('does not change directory if GITHUB_WORKSPACE is not set', async () => {
delete process.env.GITHUB_WORKSPACE
await callAsyncFunction({} as any, 'process')
expect(chdir.mock.calls.length).toBe(0)
})
})
})

15
dist/index.js vendored
View file

@ -6117,8 +6117,19 @@ var io = __webpack_require__(436);
// CONCATENATED MODULE: ./src/async-function.ts
const AsyncFunction = Object.getPrototypeOf(async () => null).constructor;
function callAsyncFunction(args, source) {
const fn = new AsyncFunction(...Object.keys(args), source);
return fn(...Object.values(args));
const previousWorkingDirectory = process.cwd();
try {
if (process.env.GITHUB_WORKSPACE !== undefined) {
process.chdir(process.env.GITHUB_WORKSPACE);
}
const fn = new AsyncFunction(...Object.keys(args), source);
return fn(...Object.values(args));
}
finally {
if (previousWorkingDirectory !== process.cwd()) {
process.chdir(previousWorkingDirectory);
}
}
}
// CONCATENATED MODULE: ./src/main.ts

View file

@ -19,6 +19,17 @@ export function callAsyncFunction<T>(
args: AsyncFunctionArguments,
source: string
): Promise<T> {
const fn = new AsyncFunction(...Object.keys(args), source)
return fn(...Object.values(args))
const previousWorkingDirectory = process.cwd()
try {
if (process.env.GITHUB_WORKSPACE !== undefined) {
process.chdir(process.env.GITHUB_WORKSPACE)
}
const fn = new AsyncFunction(...Object.keys(args), source)
return fn(...Object.values(args))
} finally {
if (previousWorkingDirectory !== process.cwd()) {
process.chdir(previousWorkingDirectory)
}
}
}