2019-05-16 20:40:21 +00:00
# `@actions/core`
2019-05-17 03:36:45 +00:00
> Core functions for setting results, logging, registering secrets and exporting variables across actions
2019-05-16 20:40:21 +00:00
## Usage
2019-10-01 17:53:09 +00:00
### Import the package
2019-08-04 13:00:04 +00:00
2019-08-21 05:15:05 +00:00
```js
2019-10-01 17:53:09 +00:00
// javascript
2019-08-04 13:00:04 +00:00
const core = require('@actions/core');
2019-10-01 17:53:09 +00:00
// typescript
import * as core from '@actions/core';
```
2019-08-04 13:00:04 +00:00
2019-10-01 17:53:09 +00:00
#### Inputs/Outputs
2021-04-28 20:32:25 +00:00
Action inputs can be read with `getInput` which returns a `string` or `getBooleanInput` which parses a boolean based on the [yaml 1.2 specification ](https://yaml.org/spec/1.2/spec.html#id2804923 ). If `required` set to be false, the input should have a default value in `action.yml` .
Outputs can be set with `setOutput` which makes them available to be mapped into inputs of other actions to ensure they are decoupled.
2019-10-01 17:53:09 +00:00
```js
const myInput = core.getInput('inputName', { required: true });
2021-04-28 20:32:25 +00:00
const myBooleanInput = core.getBooleanInput('booleanInputName', { required: true });
2021-06-07 19:09:34 +00:00
const myMultilineInput = core.getMultilineInput('multilineInputName', { required: true });
2019-08-04 13:00:04 +00:00
core.setOutput('outputKey', 'outputVal');
```
2019-08-24 13:17:35 +00:00
#### Exporting variables
2019-08-04 13:00:04 +00:00
2019-10-01 17:53:09 +00:00
Since each step runs in a separate process, you can use `exportVariable` to add it to this step and future steps environment blocks.
2019-08-04 13:00:04 +00:00
2019-08-21 05:15:05 +00:00
```js
2019-10-01 17:53:09 +00:00
core.exportVariable('envVar', 'Val');
```
2019-08-04 13:00:04 +00:00
2019-10-01 21:13:05 +00:00
#### Setting a secret
Setting a secret registers the secret with the runner to ensure it is masked in logs.
2019-08-04 13:00:04 +00:00
2019-10-01 17:53:09 +00:00
```js
2019-10-01 21:13:05 +00:00
core.setSecret('myPassword');
2019-08-04 13:00:04 +00:00
```
#### PATH Manipulation
2019-10-01 17:53:09 +00:00
To make a tool's path available in the path for the remainder of the job (without altering the machine or containers state), use `addPath` . The runner will prepend the path given to the jobs PATH.
2019-08-04 13:00:04 +00:00
2019-08-21 05:16:47 +00:00
```js
2019-10-01 17:53:09 +00:00
core.addPath('/path/to/mytool');
2019-08-04 13:00:04 +00:00
```
#### Exit codes
2019-10-01 17:53:09 +00:00
You should use this library to set the failing exit code for your action. If status is not set and the script runs to completion, that will lead to a success.
2019-08-04 13:00:04 +00:00
2019-08-21 05:15:05 +00:00
```js
2019-08-04 13:00:04 +00:00
const core = require('@actions/core');
try {
2019-08-06 13:12:30 +00:00
// Do stuff
2019-08-04 13:00:04 +00:00
}
catch (err) {
// setFailed logs the message and sets a failing exit code
core.setFailed(`Action failed with error ${err}`);
}
2021-04-12 13:50:56 +00:00
```
2019-08-04 13:00:04 +00:00
2019-10-01 17:53:09 +00:00
Note that `setNeutral` is not yet implemented in actions V2 but equivalent functionality is being planned.
2019-08-04 13:00:04 +00:00
#### Logging
2019-08-12 21:00:55 +00:00
Finally, this library provides some utilities for logging. Note that debug logging is hidden from the logs by default. This behavior can be toggled by enabling the [Step Debug Logs ](../../docs/action-debugging.md#step-debug-logs ).
2019-08-04 13:00:04 +00:00
2019-08-21 05:15:05 +00:00
```js
2019-08-04 13:00:04 +00:00
const core = require('@actions/core');
const myInput = core.getInput('input');
try {
core.debug('Inside try block');
if (!myInput) {
2019-08-21 19:31:44 +00:00
core.warning('myInput was not set');
2019-08-04 13:00:04 +00:00
}
2020-03-02 12:45:27 +00:00
if (core.isDebug()) {
// curl -v https://github.com
} else {
// curl https://github.com
}
2019-08-04 13:00:04 +00:00
// Do stuff
2020-06-24 14:48:13 +00:00
core.info('Output to the actions build log')
2021-07-28 21:34:31 +00:00
core.notice('This is a message that will also emit an annotation')
2019-08-04 13:00:04 +00:00
}
catch (err) {
2019-08-13 22:13:12 +00:00
core.error(`Error ${err}, action may still succeed though`);
2019-08-04 13:00:04 +00:00
}
```
2019-08-29 02:35:27 +00:00
This library can also wrap chunks of output in foldable groups.
```js
const core = require('@actions/core')
// Manually wrap output
2019-08-29 02:36:17 +00:00
core.startGroup('Do some function')
2019-08-29 02:35:27 +00:00
doSomeFunction()
2019-08-29 02:36:17 +00:00
core.endGroup()
2019-08-29 02:35:27 +00:00
// Wrap an asynchronous function call
const result = await core.group('Do something async', async () => {
const response = await doSomeHTTPRequest()
return response
})
2019-10-03 04:41:30 +00:00
```
2021-07-28 21:34:31 +00:00
#### Annotations
This library has 3 methods that will produce [annotations ](https://docs.github.com/en/rest/reference/checks#create-a-check-run ).
```js
2023-01-11 19:12:52 +00:00
core.error('This is a bad error, action may still succeed though.')
2021-07-28 21:34:31 +00:00
core.warning('Something went wrong, but it\'s not bad enough to fail the build.')
core.notice('Something happened that you might want to know about.')
```
These will surface to the UI in the Actions page and on Pull Requests. They look something like this:
![Annotations Image ](../../docs/assets/annotations.png )
These annotations can also be attached to particular lines and columns of your source files to show exactly where a problem is occuring.
These options are:
```typescript
export interface AnnotationProperties {
/**
* A title for the annotation.
*/
title?: string
2021-09-28 13:47:06 +00:00
/**
* The name of the file for which the annotation should be created.
*/
file?: string
2021-07-28 21:34:31 +00:00
/**
* The start line for the annotation.
*/
startLine?: number
/**
* The end line for the annotation. Defaults to `startLine` when `startLine` is provided.
*/
endLine?: number
/**
* The start column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
*/
startColumn?: number
/**
2021-08-20 10:06:49 +00:00
* The end column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
2021-07-28 21:34:31 +00:00
* Defaults to `startColumn` when `startColumn` is provided.
*/
endColumn?: number
}
```
2020-09-24 14:38:19 +00:00
#### Styling output
Colored output is supported in the Action logs via standard [ANSI escape codes ](https://en.wikipedia.org/wiki/ANSI_escape_code ). 3/4 bit, 8 bit and 24 bit colors are all supported.
Foreground colors:
2021-04-28 20:32:25 +00:00
2020-09-24 14:38:19 +00:00
```js
// 3/4 bit
core.info('\u001b[35mThis foreground will be magenta')
// 8 bit
core.info('\u001b[38;5;6mThis foreground will be cyan')
// 24 bit
core.info('\u001b[38;2;255;0;0mThis foreground will be bright red')
```
Background colors:
2021-04-28 20:32:25 +00:00
2020-09-24 14:38:19 +00:00
```js
// 3/4 bit
core.info('\u001b[43mThis background will be yellow');
// 8 bit
core.info('\u001b[48;5;6mThis background will be cyan')
// 24 bit
core.info('\u001b[48;2;255;0;0mThis background will be bright red')
```
Special styles:
```js
core.info('\u001b[1mBold text')
core.info('\u001b[3mItalic text')
core.info('\u001b[4mUnderlined text')
```
ANSI escape codes can be combined with one another:
```js
core.info('\u001b[31;46mRed foreground with a cyan background and \u001b[1mbold text at the end');
```
> Note: Escape codes reset at the start of each line
2021-04-28 20:32:25 +00:00
2020-09-24 14:38:19 +00:00
```js
core.info('\u001b[35mThis foreground will be magenta')
core.info('This foreground will reset to the default')
```
Manually typing escape codes can be a little difficult, but you can use third party modules such as [ansi-styles ](https://github.com/chalk/ansi-styles ).
```js
const style = require('ansi-styles');
core.info(style.color.ansi16m.hex('#abcdef') + 'Hello world!')
```
2019-10-03 04:41:30 +00:00
#### Action state
2021-04-28 20:32:25 +00:00
You can use this library to save state and get state for sharing information between a given wrapper action:
**action.yml**:
2019-10-03 04:41:30 +00:00
```yaml
name: 'Wrapper action sample'
inputs:
name:
default: 'GitHub'
runs:
using: 'node12'
main: 'main.js'
post: 'cleanup.js'
```
In action's `main.js` :
```js
const core = require('@actions/core');
core.saveState("pidToKill", 12345);
```
In action's `cleanup.js` :
2021-04-28 20:32:25 +00:00
2019-10-03 04:41:30 +00:00
```js
const core = require('@actions/core');
var pid = core.getState("pidToKill");
2019-10-03 18:48:21 +00:00
process.kill(pid);
2020-06-24 14:48:13 +00:00
```
2023-10-04 06:24:37 +00:00
#### Environment
To check whether action runs on [GitHub Enterprise Server ](https://docs.github.com/en/enterprise-server@3.10/admin/overview/about-github-enterprise-server ) you can use isGhes helper:
```js
const core = require('@actions/core')
const isGithubEnterpriseServer = core.isGhes()
```
2021-09-28 16:55:21 +00:00
#### OIDC Token
You can use these methods to interact with the GitHub OIDC provider and get a JWT ID token which would help to get access token from third party cloud providers.
**Method Name**: getIDToken()
**Inputs**
audience : optional
**Outputs**
A [JWT ](https://jwt.io/ ) ID Token
In action's `main.ts` :
```js
const core = require('@actions/core');
async function getIDTokenAction(): Promise< void > {
const audience = core.getInput('audience', {required: false})
const id_token1 = await core.getIDToken() // ID Token with default audience
const id_token2 = await core.getIDToken(audience) // ID token with custom audience
// this id_token can be used to get access token from third party cloud providers
}
getIDTokenAction()
```
In action's `actions.yml` :
```yaml
name: 'GetIDToken'
description: 'Get ID token from Github OIDC provider'
inputs:
audience:
description: 'Audience for which the ID token is intended for'
required: false
outputs:
id_token1:
description: 'ID token obtained from OIDC provider'
id_token2:
description: 'ID token obtained from OIDC provider'
runs:
using: 'node12'
main: 'dist/index.js'
2022-06-15 15:18:44 +00:00
```
#### Filesystem path helpers
You can use these methods to manipulate file paths across operating systems.
The `toPosixPath` function converts input paths to Posix-style (Linux) paths.
The `toWin32Path` function converts input paths to Windows-style paths. These
functions work independently of the underlying runner operating system.
```js
toPosixPath('\\foo\\bar') // => /foo/bar
toWin32Path('/foo/bar') // => \foo\bar
```
The `toPlatformPath` function converts input paths to the expected value on the runner's operating system.
```js
// On a Windows runner.
toPlatformPath('/foo/bar') // => \foo\bar
// On a Linux runner.
toPlatformPath('\\foo\\bar') // => /foo/bar
```