Compare commits

..

10 Commits

Author SHA1 Message Date
Fabio Niephaus
d53592711c Bump version to 1.0.9. 2022-11-08 15:46:37 +01:00
Fabio Niephaus
bb71d9a37f Revise build reports and use HTML tables. 2022-11-08 15:46:37 +01:00
Fabio Niephaus
b4ccf78d3d Show Java version in build reports. 2022-11-07 15:06:52 +01:00
Fabio Niephaus
5ec9a94dee Display "types" instead of "classes".
Context: https://github.com/oracle/graal/pull/5336
2022-11-07 14:55:21 +01:00
Fabio Niephaus
6576e0ae31 Revise texts. [ci skip]
Co-authored-by: Bernard Horan <bernard.horan@oracle.com>
2022-11-07 10:21:48 +01:00
Fabio Niephaus
ab2d9c9984 write permissions for pull-requests scope. 2022-11-03 20:29:33 +01:00
Fabio Niephaus
f34cb2f47c Regenerate dist/ files. 2022-11-03 20:29:33 +01:00
Fabio Niephaus
5704aa1938 Split features.ts up. 2022-11-03 20:29:33 +01:00
Fabio Niephaus
f1c2f56b3e Move cache.ts to features/ directory. 2022-11-03 20:29:33 +01:00
Fabio Niephaus
cb02f04137 Introduce native-image-(job|pr)-reports feature.
Co-authored-by: Ondřej Douda <ondrej.douda@oracle.com>
2022-11-03 20:28:28 +01:00
17 changed files with 13797 additions and 277 deletions

View File

@@ -141,6 +141,9 @@ jobs:
test-native-image-msvc:
name: native-image on windows-latest
runs-on: windows-latest
permissions:
contents: read
pull-requests: write # for `native-image-pr-reports` option
steps:
- uses: actions/checkout@v3
- name: Run setup-graalvm action
@@ -149,6 +152,8 @@ jobs:
version: 'latest'
java-version: '17'
components: 'native-image'
native-image-job-reports: 'true'
native-image-pr-reports: 'true'
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build HelloWorld executable with GraalVM Native Image on Windows
run: |
@@ -159,6 +164,9 @@ jobs:
test-native-image-musl:
name: native-image-musl on ubuntu-latest
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write # for `native-image-pr-reports` option
steps:
- uses: actions/checkout@v3
- name: Run setup-graalvm action
@@ -168,6 +176,8 @@ jobs:
java-version: '19'
components: 'native-image'
native-image-musl: 'true'
native-image-job-reports: 'true'
native-image-pr-reports: 'true'
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build static HelloWorld executable with GraalVM Native Image and musl
run: |
@@ -178,6 +188,9 @@ jobs:
test-extensive:
name: extensive tests on ubuntu-latest
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write # for `native-image-pr-reports` option
steps:
- uses: actions/checkout@v3
- name: Run setup-graalvm action
@@ -187,6 +200,8 @@ jobs:
java-version: '17'
components: 'espresso,llvm-toolchain,native-image,nodejs,python,R,ruby,wasm'
set-java-home: 'false'
native-image-job-reports: 'true'
native-image-pr-reports: 'true'
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Check environment
run: |
@@ -212,7 +227,7 @@ jobs:
run: |
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
javac HelloWorld.java
native-image HelloWorld
native-image -g HelloWorld
./helloworld
- name: Build Ruby-FFI with TruffleRuby
run: |

View File

@@ -63,6 +63,7 @@ jobs:
java-version: '11'
components: 'native-image'
github-token: ${{ secrets.GITHUB_TOKEN }}
native-image-job-reports: 'true'
- name: Build and run HelloWorld.java
run: |
@@ -118,10 +119,14 @@ jobs:
| `java-version`<br>*(required)* | n/a | `'11'` or `'17'` for a specific Java version.<br>(`'8'` and `'16'` are supported for GraalVM 21.2 and earlier.) |
| `components` | `''` | Comma-spearated list of GraalVM components (e.g., `native-image` or `ruby,nodejs`) that will be installed by the [GraalVM Updater][gu]. |
| `github-token` | `''` | Token for communication with the GitHub API. Please set to `${{ secrets.GITHUB_TOKEN }}` (see [templates](#templates)) to allow the action to authenticate with the GitHub API, which helps to reduce rate limiting issues. |
| `set-java-home` | `'true'` | If set to `'true'`, instructs the action to set `$JAVA_HOME` to the path of the GraalVM installation. |
| `cache` | `''` | Name of the build platform to cache dependencies. It can be `'maven'`, `'gradle'`, or `'sbt'` and works the same way it does in [actions/setup-java][setup-java-caching]. |
| `set-java-home` | `'true'` | If set to `'true'`, instructs the action to set `$JAVA_HOME` to the path of the GraalVM installation. Overrides any previous action or command that sets `$JAVA_HOME`. |
| `cache` | `''` | Name of the build platform to cache dependencies. It can be `'maven'`, `'gradle'`, or `'sbt'` and works the same way as described in [actions/setup-java][setup-java-caching]. |
| `check-for-updates` | `'true'` | [Annotate jobs][gha-annotations] with update notifications, for example, when a new GraalVM release is available. |
| `native-image-musl` | `'false'` | If set to `'true'`, sets up [musl] for building [static images][native-image-static] with GraalVM Native Image *(Linux only)*. [Example usage][native-image-musl-build] (be sure to replace `uses: ./` with `uses: graalvm/setup-graalvm@v1`). |
| `native-image-job-reports` *) | `'false'` | If set to `'true'`, post a job summary containing a Native Image build report. |
| `native-image-musl` | `'false'` | If set to `'true'`, sets up [musl] to build [static binaries][native-image-static] with GraalVM Native Image *(Linux only)*. [Example usage][native-image-musl-build] (be sure to replace `uses: ./` with `uses: graalvm/setup-graalvm@v1`). |
| `native-image-pr-reports` *) | `'false'` | If set to `'true'`, post a comment containing a Native Image build report on pull requests. Requires `write` permissions for the [`pull-requests` scope][gha-permissions]. |
**) Make sure that Native Image is used only once per build job. Otherwise, the report is only generated for the last Native Image build.*
## Contributing
@@ -134,6 +139,7 @@ Only pull requests from committers that can be verified as having signed the OCA
[dev-build]: https://github.com/graalvm/graalvm-ce-dev-builds/releases/latest
[dev-builds]: https://github.com/graalvm/graalvm-ce-dev-builds
[gha-annotations]: https://github.com/actions/toolkit/tree/main/packages/core#annotations
[gha-permissions]: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
[gha-secrets]: https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository
[gha-self-hosted-runners]: https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners
[gu]: https://www.graalvm.org/reference-manual/graalvm-updater/

View File

@@ -27,7 +27,7 @@
import {mkdtempSync} from 'fs'
import {tmpdir} from 'os'
import {join} from 'path'
import {restore, save} from '../src/cache'
import {restore, save} from '../src/features/cache'
import * as fs from 'fs'
import * as os from 'os'
import * as core from '@actions/core'

View File

@@ -37,6 +37,14 @@ inputs:
required: false
description: 'Set up musl for static image building with GraalVM Native Image.'
default: 'false'
native-image-job-reports:
required: false
description: 'Post a job summary containing a Native Image build report.'
default: 'false'
native-image-pr-reports:
required: false
description: 'Post a comment containing a Native Image build report on pull requests.'
default: 'false'
runs:
using: 'node16'
main: 'dist/main/index.js'

10618
dist/cleanup/index.js generated vendored

File diff suppressed because one or more lines are too long

2849
dist/main/index.js generated vendored

File diff suppressed because one or more lines are too long

85
package-lock.json generated
View File

@@ -1,17 +1,18 @@
{
"name": "setup-graalvm",
"version": "1.0.8",
"version": "1.0.9",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "setup-graalvm",
"version": "1.0.8",
"version": "1.0.9",
"license": "UPL",
"dependencies": {
"@actions/cache": "^3.0.4",
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0",
"@actions/github": "^5.1.1",
"@actions/glob": "^0.3.0",
"@actions/http-client": "^1.0.11",
"@actions/io": "^1.1.1",
@@ -113,6 +114,25 @@
"@actions/io": "^1.0.1"
}
},
"node_modules/@actions/github": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
"integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
"dependencies": {
"@actions/http-client": "^2.0.1",
"@octokit/core": "^3.6.0",
"@octokit/plugin-paginate-rest": "^2.17.0",
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
}
},
"node_modules/@actions/github/node_modules/@actions/http-client": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
"dependencies": {
"tunnel": "^0.0.6"
}
},
"node_modules/@actions/glob": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.3.0.tgz",
@@ -1518,6 +1538,29 @@
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
"integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
},
"node_modules/@octokit/plugin-paginate-rest": {
"version": "2.21.3",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
"integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
"dependencies": {
"@octokit/types": "^6.40.0"
},
"peerDependencies": {
"@octokit/core": ">=2"
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods": {
"version": "5.16.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
"integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
"dependencies": {
"@octokit/types": "^6.39.0",
"deprecation": "^2.3.1"
},
"peerDependencies": {
"@octokit/core": ">=3"
}
},
"node_modules/@octokit/request": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
@@ -7048,6 +7091,27 @@
"@actions/io": "^1.0.1"
}
},
"@actions/github": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
"integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
"requires": {
"@actions/http-client": "^2.0.1",
"@octokit/core": "^3.6.0",
"@octokit/plugin-paginate-rest": "^2.17.0",
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
},
"dependencies": {
"@actions/http-client": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
"requires": {
"tunnel": "^0.0.6"
}
}
}
},
"@actions/glob": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.3.0.tgz",
@@ -8175,6 +8239,23 @@
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
"integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
},
"@octokit/plugin-paginate-rest": {
"version": "2.21.3",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
"integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
"requires": {
"@octokit/types": "^6.40.0"
}
},
"@octokit/plugin-rest-endpoint-methods": {
"version": "5.16.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
"integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
"requires": {
"@octokit/types": "^6.39.0",
"deprecation": "^2.3.1"
}
},
"@octokit/request": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",

View File

@@ -1,6 +1,6 @@
{
"name": "setup-graalvm",
"version": "1.0.8",
"version": "1.0.9",
"private": true,
"description": "GitHub Action for GraalVM",
"main": "lib/main.js",
@@ -29,6 +29,7 @@
"@actions/cache": "^3.0.4",
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0",
"@actions/github": "^5.1.1",
"@actions/glob": "^0.3.0",
"@actions/http-client": "^1.0.11",
"@actions/io": "^1.1.1",

View File

@@ -26,7 +26,8 @@
import * as core from '@actions/core'
import * as constants from './constants'
import {save} from './cache'
import {save} from './features/cache'
import {generateReports} from './features/reports'
/**
* Check given input and run a save process for the specified package manager
@@ -56,6 +57,7 @@ async function ignoreError(promise: Promise<void>): Promise<unknown> {
}
export async function run(): Promise<void> {
generateReports()
await ignoreError(saveCache())
}

View File

@@ -28,6 +28,9 @@ export const MANDREL_NAMESPACE = 'mandrel-'
export const GDS_BASE = 'https://gds.oracle.com/api/20220101'
export const GDS_GRAALVM_PRODUCT_ID = 'D53FAE8052773FFAE0530F15000AA6C6'
export const ENV_GITHUB_EVENT_NAME = 'GITHUB_EVENT_NAME'
export const EVENT_NAME_PULL_REQUEST = 'pull_request'
export type LatestReleaseResponse =
otypes.Endpoints['GET /repos/{owner}/{repo}/releases/latest']['response']

View File

@@ -0,0 +1,30 @@
import * as core from '@actions/core'
import {toSemVer} from '../utils'
import {lt, major, minor, valid} from 'semver'
import {getLatestReleaseVersion} from '../graalvm'
export async function checkForUpdates(
graalVMVersion: string,
javaVersion: string
): Promise<void> {
if (graalVMVersion === '22.3.0' && javaVersion === '11') {
core.notice(
'Please consider upgrading your project to Java 17+. The GraalVM 22.3.0 release is the last to support JDK11: https://github.com/oracle/graal/issues/5063'
)
return
}
const latestGraalVMVersion = await getLatestReleaseVersion()
const selectedVersion = toSemVer(graalVMVersion)
const latestVersion = toSemVer(latestGraalVMVersion)
if (
valid(selectedVersion) &&
valid(latestVersion) &&
lt(selectedVersion, latestVersion)
) {
core.notice(
`A new GraalVM release is available! Please consider upgrading to GraalVM ${latestGraalVMVersion}. Release notes: https://www.graalvm.org/release-notes/${major(
latestVersion
)}_${minor(latestVersion)}/`
)
}
}

View File

@@ -1,40 +1,12 @@
import * as c from './constants'
import * as c from '../constants'
import * as core from '@actions/core'
import * as tc from '@actions/tool-cache'
import {exec, toSemVer} from './utils'
import {exec} from '../utils'
import {join} from 'path'
import {lt, major, minor, valid} from 'semver'
import {getLatestReleaseVersion} from './graalvm'
const MUSL_NAME = 'x86_64-linux-musl-native'
const MUSL_VERSION = '10.2.1'
export async function checkForUpdates(
graalVMVersion: string,
javaVersion: string
): Promise<void> {
if (graalVMVersion === '22.3.0' && javaVersion === '11') {
core.notice(
'Please consider upgrading your project to Java 17+. The GraalVM 22.3.0 release is the last to support JDK11: https://github.com/oracle/graal/issues/5063'
)
return
}
const latestGraalVMVersion = await getLatestReleaseVersion()
const selectedVersion = toSemVer(graalVMVersion)
const latestVersion = toSemVer(latestGraalVMVersion)
if (
valid(selectedVersion) &&
valid(latestVersion) &&
lt(selectedVersion, latestVersion)
) {
core.notice(
`A new GraalVM release is available! Please consider upgrading to GraalVM ${latestGraalVMVersion}. Release notes: https://www.graalvm.org/release-notes/${major(
latestVersion
)}_${minor(latestVersion)}/`
)
}
}
export async function setUpNativeImageMusl(): Promise<void> {
if (!c.IS_LINUX) {
core.warning('musl is only supported on Linux')

379
src/features/reports.ts Normal file
View File

@@ -0,0 +1,379 @@
import * as c from '../constants'
import * as core from '@actions/core'
import * as fs from 'fs'
import * as github from '@actions/github'
import {join} from 'path'
import {tmpdir} from 'os'
import {createPRComment, isPREvent, toSemVer} from '../utils'
import {gte} from 'semver'
const BUILD_OUTPUT_JSON_PATH = join(tmpdir(), 'native-image-build-output.json')
const BYTES_TO_KiB = 1024
const BYTES_TO_MiB = 1024 * 1024
const BYTES_TO_GiB = 1024 * 1024 * 1024
const DOCS_BASE =
'https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/BuildOutput.md'
const INPUT_NI_JOB_REPORTS = 'native-image-job-reports'
const INPUT_NI_PR_REPORTS = 'native-image-pr-reports'
const NATIVE_IMAGE_CONFIG_FILE = join(
tmpdir(),
'native-image-options.properties'
)
const NATIVE_IMAGE_CONFIG_FILE_ENV = 'NATIVE_IMAGE_CONFIG_FILE'
interface AnalysisResult {
total: number
reachable: number
reflection: number
jni: number
}
interface BuildOutput {
general_info: {
name: string
graalvm_version: string
java_version: string | null
c_compiler: string | null
garbage_collector: string
}
analysis_results: {
classes: AnalysisResult
fields: AnalysisResult
methods: AnalysisResult
}
image_details: {
total_bytes: number
code_area: {
bytes: number
compilation_units: number
}
image_heap: {
bytes: number
resources: {
count: number
bytes: number
}
}
debug_info?: {
bytes: number
}
runtime_compiled_methods?: {
count: number
graph_encoding_bytes: number
}
}
resource_usage: {
cpu: {
load: number
total_cores: number
}
garbage_collection: {
count: number
total_secs: number
}
memory: {
system_total: number
peak_rss_bytes: number
}
}
}
export async function setUpNativeImageBuildReports(
graalVMVersion: string
): Promise<void> {
const isRequired = areJobReportsEnabled() || arePRReportsEnabled()
if (!isRequired) {
return
}
const isSupported =
graalVMVersion === c.VERSION_LATEST ||
graalVMVersion === c.VERSION_DEV ||
(!graalVMVersion.startsWith(c.MANDREL_NAMESPACE) &&
gte(toSemVer(graalVMVersion), '22.2.0'))
if (!isSupported) {
core.warning(
`Build reports for PRs and job summaries are only available in GraalVM 22.2.0 or later. This build job uses GraalVM ${graalVMVersion}.`
)
return
}
setNativeImageOption(
`-H:BuildOutputJSONFile=${BUILD_OUTPUT_JSON_PATH.replace(/\\/g, '\\\\')}`
) // Escape backslashes for Windows
}
export function generateReports(): void {
if (areJobReportsEnabled() || arePRReportsEnabled()) {
if (!fs.existsSync(BUILD_OUTPUT_JSON_PATH)) {
core.warning(
'Unable to find build output data to create a report. Are you sure this build job has used GraalVM Native Image?'
)
return
}
const buildOutput: BuildOutput = JSON.parse(
fs.readFileSync(BUILD_OUTPUT_JSON_PATH, 'utf8')
)
const report = createReport(buildOutput)
if (areJobReportsEnabled()) {
core.summary.addRaw(report)
core.summary.write()
}
if (arePRReportsEnabled()) {
createPRComment(report)
}
}
}
function areJobReportsEnabled(): boolean {
return core.getInput(INPUT_NI_JOB_REPORTS) === 'true'
}
function arePRReportsEnabled(): boolean {
return isPREvent() && core.getInput(INPUT_NI_PR_REPORTS) === 'true'
}
function getNativeImageOptionsFile(): string {
let optionsFile = process.env[NATIVE_IMAGE_CONFIG_FILE_ENV]
if (optionsFile === undefined) {
optionsFile = NATIVE_IMAGE_CONFIG_FILE
core.exportVariable(NATIVE_IMAGE_CONFIG_FILE_ENV, optionsFile)
}
return optionsFile
}
function setNativeImageOption(value: string): void {
const optionsFile = getNativeImageOptionsFile()
if (fs.existsSync(optionsFile)) {
fs.appendFileSync(optionsFile, ` ${value}`)
} else {
fs.writeFileSync(optionsFile, `NativeImageArgs = ${value}`)
}
}
function createReport(data: BuildOutput): string {
const context = github.context
const info = data.general_info
const analysis = data.analysis_results
const details = data.image_details
const debugInfoBytes = details.debug_info ? details.debug_info.bytes : 0
const otherBytes =
details.total_bytes -
details.code_area.bytes -
details.image_heap.bytes -
debugInfoBytes
let debugInfoLine = ''
if (details.debug_info) {
debugInfoLine = `
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-debug-info" target="_blank">Debug info</a></td>
<td align="right">${bytesToHuman(debugInfoBytes)}</td>
<td align="right">${toPercent(debugInfoBytes, details.total_bytes)}</td>
<td align="left"></td>
</tr>`
}
const resources = data.resource_usage
return `## GraalVM Native Image Build Report
\`${info.name}\` generated as part of the '${
context.job
}' job in run <a href="${context.serverUrl}/${context.repo.owner}/${
context.repo.repo
}/actions/runs/${context.runId}" target="_blank">#${context.runNumber}</a>.
#### Environment
<table>
<tr>
<td><a href="${DOCS_BASE}#glossary-version-info" target="_blank">GraalVM version</a></td>
<td>${info.graalvm_version}</td>
<td><a href="${DOCS_BASE}#glossary-ccompiler" target="_blank">C compiler</a></td>
<td>${info.c_compiler}</td>
</tr>
<tr>
<td><a href="${DOCS_BASE}#glossary-java-version-info" target="_blank">Java version</a></td>
<td>${info.java_version}</td>
<td><a href="${DOCS_BASE}#glossary-gc" target="_blank">Garbage collector</a></td>
<td>${info.garbage_collector}</td>
</tr>
</table>
#### Analysis Results
<table>
<thead>
<tr>
<th align="left">Category</th>
<th align="right">Types</th>
<th align="right">in %</th>
<th align="right">Fields</th>
<th align="right">in %</th>
<th align="right">Methods</th>
<th align="right">in %</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-reachability" target="_blank">Reachable</a></td>
<td align="right">${analysis.classes.reachable}</td>
<td align="right">${toPercent(
analysis.classes.reachable,
analysis.classes.total
)}</td>
<td align="right">${analysis.fields.reachable}</td>
<td align="right">${toPercent(
analysis.fields.reachable,
analysis.fields.total
)}</td>
<td align="right">${analysis.methods.reachable}</td>
<td align="right">${toPercent(
analysis.methods.reachable,
analysis.methods.total
)}</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-reflection-registrations" target="_blank">Reflection</a></td>
<td align="right">${analysis.classes.reflection}</td>
<td align="right">${toPercent(
analysis.classes.reflection,
analysis.classes.total
)}</td>
<td align="right">${analysis.fields.reflection}</td>
<td align="right">${toPercent(
analysis.fields.reflection,
analysis.fields.total
)}</td>
<td align="right">${analysis.methods.reflection}</td>
<td align="right">${toPercent(
analysis.methods.reflection,
analysis.methods.total
)}</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-jni-access-registrations" target="_blank">JNI</a></td>
<td align="right">${analysis.classes.jni}</td>
<td align="right">${toPercent(
analysis.classes.jni,
analysis.classes.total
)}</td>
<td align="right">${analysis.fields.jni}</td>
<td align="right">${toPercent(
analysis.fields.jni,
analysis.fields.total
)}</td>
<td align="right">${analysis.methods.jni}</td>
<td align="right">${toPercent(
analysis.methods.jni,
analysis.methods.total
)}</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-reachability" target="_blank">Loaded</a></td>
<td align="right">${analysis.classes.total}</td>
<td align="right">100.000%</td>
<td align="right">${analysis.fields.total}</td>
<td align="right">100.000%</td>
<td align="right">${analysis.methods.total}</td>
<td align="right">100.000%</td>
</tr>
</tbody>
</table>
#### Image Details
<table>
<thead>
<tr>
<th align="left">Category</th>
<th align="right">Size</th>
<th align="right">in %</th>
<th align="left">Details</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-code-area" target="_blank">Code area</a></td>
<td align="right">${bytesToHuman(details.code_area.bytes)}</td>
<td align="right">${toPercent(
details.code_area.bytes,
details.total_bytes
)}</td>
<td align="left">${
details.code_area.compilation_units
} compilation units</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-image-heap" target="_blank">Image heap</a></td>
<td align="right">${bytesToHuman(details.image_heap.bytes)}</td>
<td align="right">${toPercent(
details.image_heap.bytes,
details.total_bytes
)}</td>
<td align="left">${bytesToHuman(
details.image_heap.resources.bytes
)} for ${details.image_heap.resources.count} resources</td>
</tr>${debugInfoLine}
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-other-data" target="_blank">Other data</a></td>
<td align="right">${bytesToHuman(otherBytes)}</td>
<td align="right">${toPercent(otherBytes, details.total_bytes)}</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">Total</td>
<td align="right"><strong>${bytesToHuman(
details.total_bytes
)}</strong></td>
<td align="right">100.000%</td>
<td align="left"></td>
</tr>
</tbody>
</table>
#### Resource Usage
<table>
<tbody>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-garbage-collections" target="_blank">Garbage collection</a></td>
<td align="left">${resources.garbage_collection.total_secs.toFixed(
2
)}s in ${resources.garbage_collection.count} GCs</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-peak-rss" target="_blank">Peak RSS</a></td>
<td align="left">${bytesToHuman(
resources.memory.peak_rss_bytes
)} (${toPercent(
resources.memory.peak_rss_bytes,
resources.memory.system_total
)} of ${bytesToHuman(resources.memory.system_total)} system memory)</td>
</tr>
<tr>
<td align="left"><a href="${DOCS_BASE}#glossary-cpu-load" target="_blank">CPU load</a></td>
<td align="left">${resources.cpu.load.toFixed(3)} (${toPercent(
resources.cpu.load,
resources.cpu.total_cores
)} of ${resources.cpu.total_cores} CPU cores)</td>
</tr>
</tbody>
</table>
<em>Report generated by <a href="https://github.com/marketplace/actions/github-action-for-graalvm" target="_blank">setup-graalvm</a>.</em>`
}
function toPercent(part: number, total: number): string {
return `${((part / total) * 100).toFixed(3)}%`
}
function bytesToHuman(bytes: number): string {
if (bytes < BYTES_TO_KiB) {
return `${bytes.toFixed(2)}B`
} else if (bytes < BYTES_TO_MiB) {
return `${(bytes / BYTES_TO_KiB).toFixed(2)}KB`
} else if (bytes < BYTES_TO_GiB) {
return `${(bytes / BYTES_TO_MiB).toFixed(2)}MB`
} else {
return `${(bytes / BYTES_TO_GiB).toFixed(2)}GB`
}
}

View File

@@ -32,7 +32,7 @@ export async function downloadGraalVMEE(
version: string,
javaVersion: string
): Promise<string> {
const userAgent = `GraalVMGitHubAction/1.0.8 (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
const userAgent = `GraalVMGitHubAction/1.0.9 (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
const baseArtifact = await fetchArtifact(
userAgent,
'isBase:True',

View File

@@ -3,12 +3,14 @@ import * as core from '@actions/core'
import * as graalvm from './graalvm'
import {isFeatureAvailable as isCacheAvailable} from '@actions/cache'
import {join} from 'path'
import {restore} from './cache'
import {restore} from './features/cache'
import {setUpDependencies} from './dependencies'
import {setUpGUComponents} from './gu'
import {setUpMandrel} from './mandrel'
import {checkForUpdates, setUpNativeImageMusl} from './features'
import {checkForUpdates} from './features/check-for-updates'
import {setUpNativeImageMusl} from './features/musl'
import {setUpWindowsEnvironment} from './msvc'
import {setUpNativeImageBuildReports} from './features/reports'
async function run(): Promise<void> {
try {
@@ -79,6 +81,7 @@ async function run(): Promise<void> {
if (cache && isCacheAvailable()) {
await restore(cache)
}
setUpNativeImageBuildReports(graalvmVersion)
} catch (error) {
if (error instanceof Error) core.setFailed(error.message)
}

View File

@@ -1,5 +1,6 @@
import * as c from './constants'
import * as core from '@actions/core'
import * as github from '@actions/github'
import * as httpClient from '@actions/http-client'
import * as tc from '@actions/tool-cache'
import {ExecOptions, exec as e} from '@actions/exec'
@@ -35,7 +36,7 @@ export async function exec(
export async function getLatestRelease(
repo: string
): Promise<c.LatestReleaseResponse['data']> {
const githubToken = core.getInput('github-token')
const githubToken = getGitHubToken()
const options = githubToken.length > 0 ? {auth: githubToken} : {}
const octokit = new GitHub(options)
return (
@@ -112,3 +113,23 @@ export function toSemVer(version: string): string {
const patch = parts.length > 2 ? parts.slice(2).join('-') : '0'
return `${major}.${minor}.${patch}`
}
export function isPREvent(): boolean {
return process.env[c.ENV_GITHUB_EVENT_NAME] === c.EVENT_NAME_PULL_REQUEST
}
function getGitHubToken(): string {
return core.getInput(c.INPUT_GITHUB_TOKEN)
}
export async function createPRComment(content: string): Promise<void> {
if (!isPREvent()) {
throw new Error('Not a PR event.')
}
const context = github.context
await github.getOctokit(getGitHubToken()).rest.issues.createComment({
...context.repo,
issue_number: context.payload.pull_request?.number as number,
body: content
})
}