Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78f22073df | ||
|
|
b11d36630f | ||
|
|
babc303d7e | ||
|
|
5f2753d6bc | ||
|
|
6acd592e3e | ||
|
|
cf001e2d43 | ||
|
|
90a2c32c8b | ||
|
|
4297237826 | ||
|
|
c85a448ca4 | ||
|
|
c8fdb59e88 | ||
|
|
40947ba8ce | ||
|
|
4356481765 | ||
|
|
8b27096bbf | ||
|
|
93d8fee7fa | ||
|
|
76d605752b | ||
|
|
b53bc17dd7 | ||
|
|
d01f5f519f | ||
|
|
4aba115fa5 | ||
|
|
7c84ab1ba7 | ||
|
|
778af55c2a | ||
|
|
a20b6434b3 | ||
|
|
2ada328403 | ||
|
|
254814bb57 | ||
|
|
79e8ca0cfa | ||
|
|
d53592711c | ||
|
|
bb71d9a37f | ||
|
|
b4ccf78d3d | ||
|
|
5ec9a94dee | ||
|
|
6576e0ae31 | ||
|
|
ab2d9c9984 | ||
|
|
f34cb2f47c | ||
|
|
5704aa1938 | ||
|
|
f1c2f56b3e | ||
|
|
cb02f04137 |
88
.github/workflows/test.yml
vendored
88
.github/workflows/test.yml
vendored
@@ -25,23 +25,32 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
version: [latest, dev]
|
version: ['latest', 'dev']
|
||||||
java-version: ['17', '19']
|
java-version: ['19', '20']
|
||||||
components: ['native-image']
|
components: ['native-image']
|
||||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||||
|
exclude:
|
||||||
|
- version: 'latest'
|
||||||
|
java-version: '20'
|
||||||
|
- version: 'dev'
|
||||||
|
java-version: '19'
|
||||||
include:
|
include:
|
||||||
- version: '22.2.0' # for update notifications
|
- version: '22.2.0' # for update notifications
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
os: ubuntu-18.04
|
os: ubuntu-20.04
|
||||||
- version: '22.3.0'
|
- version: '22.3.1'
|
||||||
java-version: '11' # for JDK11 notification
|
java-version: '11' # for JDK11 notification
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
os: macos-11
|
os: macos-11
|
||||||
- version: '22.3.0'
|
- version: '22.3.1'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
os: windows-2022
|
os: windows-2022
|
||||||
|
- version: 'dev'
|
||||||
|
java-version: 'dev'
|
||||||
|
components: 'native-image'
|
||||||
|
os: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Run setup-graalvm action
|
- name: Run setup-graalvm action
|
||||||
@@ -63,6 +72,7 @@ jobs:
|
|||||||
java --version
|
java --version
|
||||||
java --version | grep "GraalVM CE" || exit 34
|
java --version | grep "GraalVM CE" || exit 34
|
||||||
native-image --version
|
native-image --version
|
||||||
|
gu list
|
||||||
if: runner.os != 'Windows'
|
if: runner.os != 'Windows'
|
||||||
- name: Check Windows environment
|
- name: Check Windows environment
|
||||||
run: |
|
run: |
|
||||||
@@ -70,6 +80,7 @@ jobs:
|
|||||||
echo "JAVA_HOME: $env:JAVA_HOME"
|
echo "JAVA_HOME: $env:JAVA_HOME"
|
||||||
java --version
|
java --version
|
||||||
native-image --version
|
native-image --version
|
||||||
|
gu.cmd remove native-image
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
test-ee:
|
test-ee:
|
||||||
name: EE ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
|
name: EE ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
|
||||||
@@ -77,10 +88,19 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
version: ['22.3.0', 'latest']
|
version: ['latest']
|
||||||
java-version: ['11', '17', '19']
|
java-version: ['19']
|
||||||
components: ['native-image']
|
components: ['native-image']
|
||||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||||
|
include:
|
||||||
|
- version: '22.3.0'
|
||||||
|
java-version: '11'
|
||||||
|
components: 'native-image'
|
||||||
|
os: ubuntu-latest
|
||||||
|
- version: '22.3.0'
|
||||||
|
java-version: '17'
|
||||||
|
components: 'native-image'
|
||||||
|
os: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Run setup-graalvm action
|
- name: Run setup-graalvm action
|
||||||
@@ -99,6 +119,7 @@ jobs:
|
|||||||
java --version
|
java --version
|
||||||
java --version | grep "GraalVM EE" || exit 23
|
java --version | grep "GraalVM EE" || exit 23
|
||||||
native-image --version
|
native-image --version
|
||||||
|
gu list
|
||||||
if: runner.os != 'Windows'
|
if: runner.os != 'Windows'
|
||||||
- name: Check Windows environment
|
- name: Check Windows environment
|
||||||
run: |
|
run: |
|
||||||
@@ -106,6 +127,7 @@ jobs:
|
|||||||
echo "JAVA_HOME: $env:JAVA_HOME"
|
echo "JAVA_HOME: $env:JAVA_HOME"
|
||||||
java --version
|
java --version
|
||||||
native-image --version
|
native-image --version
|
||||||
|
gu.cmd remove native-image
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
test-mandrel:
|
test-mandrel:
|
||||||
name: ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
|
name: ${{ matrix.version }} + JDK${{ matrix.java-version }} on ${{ matrix.os }}
|
||||||
@@ -138,17 +160,45 @@ jobs:
|
|||||||
java --version
|
java --version
|
||||||
native-image --version
|
native-image --version
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
test-native-image-msvc:
|
test-native-image-windows:
|
||||||
name: native-image on windows-latest
|
name: native-image on windows-latest
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write # for `native-image-pr-reports` option
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Run setup-graalvm action
|
- name: Run setup-graalvm action
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: 'latest'
|
version: 'dev'
|
||||||
|
java-version: 'dev'
|
||||||
|
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: |
|
||||||
|
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
|
||||||
|
javac HelloWorld.java
|
||||||
|
native-image HelloWorld
|
||||||
|
./helloworld
|
||||||
|
test-native-image-windows-msvc:
|
||||||
|
name: native-image on windows-2019
|
||||||
|
runs-on: windows-2019
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write # for `native-image-pr-reports` option
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Run setup-graalvm action
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
version: '22.3.1'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
|
native-image-job-reports: 'true'
|
||||||
|
native-image-pr-reports: 'true'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Build HelloWorld executable with GraalVM Native Image on Windows
|
- name: Build HelloWorld executable with GraalVM Native Image on Windows
|
||||||
run: |
|
run: |
|
||||||
@@ -159,15 +209,20 @@ jobs:
|
|||||||
test-native-image-musl:
|
test-native-image-musl:
|
||||||
name: native-image-musl on ubuntu-latest
|
name: native-image-musl on ubuntu-latest
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write # for `native-image-pr-reports` option
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Run setup-graalvm action
|
- name: Run setup-graalvm action
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: 'latest'
|
version: 'dev'
|
||||||
java-version: '19'
|
java-version: 'dev'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
native-image-musl: 'true'
|
native-image-musl: 'true'
|
||||||
|
native-image-job-reports: 'true'
|
||||||
|
native-image-pr-reports: 'true'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Build static HelloWorld executable with GraalVM Native Image and musl
|
- name: Build static HelloWorld executable with GraalVM Native Image and musl
|
||||||
run: |
|
run: |
|
||||||
@@ -178,15 +233,20 @@ jobs:
|
|||||||
test-extensive:
|
test-extensive:
|
||||||
name: extensive tests on ubuntu-latest
|
name: extensive tests on ubuntu-latest
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write # for `native-image-pr-reports` option
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Run setup-graalvm action
|
- name: Run setup-graalvm action
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: 'dev'
|
version: 'latest'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
components: 'espresso,llvm-toolchain,native-image,nodejs,python,R,ruby,wasm'
|
components: 'espresso,llvm-toolchain,native-image,nodejs,python,R,ruby,wasm'
|
||||||
set-java-home: 'false'
|
set-java-home: 'false'
|
||||||
|
native-image-job-reports: 'true'
|
||||||
|
native-image-pr-reports: 'true'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Check environment
|
- name: Check environment
|
||||||
run: |
|
run: |
|
||||||
@@ -212,7 +272,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
|
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
|
||||||
javac HelloWorld.java
|
javac HelloWorld.java
|
||||||
native-image HelloWorld
|
native-image -g HelloWorld
|
||||||
./helloworld
|
./helloworld
|
||||||
- name: Build Ruby-FFI with TruffleRuby
|
- name: Build Ruby-FFI with TruffleRuby
|
||||||
run: |
|
run: |
|
||||||
@@ -225,3 +285,5 @@ jobs:
|
|||||||
bundle exec rake compile
|
bundle exec rake compile
|
||||||
bundle exec rake test
|
bundle exec rake test
|
||||||
popd > /dev/null
|
popd > /dev/null
|
||||||
|
- name: Remove components
|
||||||
|
run: gu remove espresso llvm-toolchain nodejs python R ruby wasm
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -60,9 +60,10 @@ jobs:
|
|||||||
- uses: graalvm/setup-graalvm@v1
|
- uses: graalvm/setup-graalvm@v1
|
||||||
with:
|
with:
|
||||||
version: '22.3.0'
|
version: '22.3.0'
|
||||||
java-version: '11'
|
java-version: '17'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
native-image-job-reports: 'true'
|
||||||
|
|
||||||
- name: Build and run HelloWorld.java
|
- name: Build and run HelloWorld.java
|
||||||
run: |
|
run: |
|
||||||
@@ -99,7 +100,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: '22.3.0'
|
version: '22.3.0'
|
||||||
gds-token: ${{ secrets.GDS_TOKEN }}
|
gds-token: ${{ secrets.GDS_TOKEN }}
|
||||||
java-version: '11'
|
java-version: '17'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Example step
|
- name: Example step
|
||||||
@@ -113,15 +114,19 @@ jobs:
|
|||||||
|
|
||||||
| Name | Default | Description |
|
| Name | Default | Description |
|
||||||
|-----------------|:--------:|-------------|
|
|-----------------|:--------:|-------------|
|
||||||
| `version`<br>*(required)* | n/a | `X.Y.Z` (e.g., `21.3.0`) for a specific [GraalVM release][releases]<br>`latest` for [latest stable release][stable],<br>`dev` for [latest dev build][dev-build],<br>`mandrel-X.Y.Z` (e.g., `mandrel-21.3.0.0-Final`) for a specific [Mandrel release][mandrel-releases],<br>`mandrel-latest` for [latest Mandrel stable release][mandrel-stable]. |
|
| `version`<br>*(required)* | n/a | `X.Y.Z` (e.g., `22.3.0`) for a specific [GraalVM release][releases]<br>`latest` for [latest stable release][stable],<br>`dev` for [latest dev build][dev-build],<br>`mandrel-X.Y.Z` (e.g., `mandrel-21.3.0.0-Final`) for a specific [Mandrel release][mandrel-releases],<br>`mandrel-latest` for [latest Mandrel stable release][mandrel-stable]. |
|
||||||
| `gds-token` | `''` | Download token for the GraalVM Download Service. If a non-empty token is provided, the action will set up GraalVM Enterprise Edition (see [GraalVM EE template](#basic-graalvm-enterprise-edition-template)). |
|
| `gds-token` | `''` | Download token for the GraalVM Download Service. If a non-empty token is provided, the action will set up GraalVM Enterprise Edition (see [GraalVM EE template](#basic-graalvm-enterprise-edition-template)). |
|
||||||
| `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.) |
|
| `java-version`<br>*(required)* | n/a | `'17'` or `'19'` for a specific Java version, `'dev'` for the highest Java version available (requires `version: 'dev'`).<br>(`'8'`, `'11'`, `'16'` are supported for older GraalVM releases.) |
|
||||||
| `components` | `''` | Comma-spearated list of GraalVM components (e.g., `native-image` or `ruby,nodejs`) that will be installed by the [GraalVM Updater][gu]. |
|
| `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. |
|
| `github-token` | `'${{ 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. |
|
| `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 it does in [actions/setup-java][setup-java-caching]. |
|
| `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. |
|
| `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-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-job-reports` *) | `'false'` | If set to `'true'`, post a job summary containing a Native Image build report. |
|
||||||
|
| `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
|
## 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-build]: https://github.com/graalvm/graalvm-ce-dev-builds/releases/latest
|
||||||
[dev-builds]: https://github.com/graalvm/graalvm-ce-dev-builds
|
[dev-builds]: https://github.com/graalvm/graalvm-ce-dev-builds
|
||||||
[gha-annotations]: https://github.com/actions/toolkit/tree/main/packages/core#annotations
|
[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-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
|
[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/
|
[gu]: https://www.graalvm.org/reference-manual/graalvm-updater/
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
import {mkdtempSync} from 'fs'
|
import {mkdtempSync} from 'fs'
|
||||||
import {tmpdir} from 'os'
|
import {tmpdir} from 'os'
|
||||||
import {join} from 'path'
|
import {join} from 'path'
|
||||||
import {restore, save} from '../src/cache'
|
import {restore, save} from '../src/features/cache'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
|||||||
64
__tests__/graalvm.test.ts
Normal file
64
__tests__/graalvm.test.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import * as path from 'path'
|
||||||
|
import * as graalvm from '../src/graalvm'
|
||||||
|
import {expect, test} from '@jest/globals'
|
||||||
|
import {getTaggedRelease} from '../src/utils'
|
||||||
|
import {findGraalVMVersion, findHighestJavaVersion} from '../src/graalvm'
|
||||||
|
import {GRAALVM_RELEASES_REPO} from '../src/constants'
|
||||||
|
|
||||||
|
process.env['RUNNER_TOOL_CACHE'] = path.join(__dirname, 'TOOL_CACHE')
|
||||||
|
process.env['RUNNER_TEMP'] = path.join(__dirname, 'TEMP')
|
||||||
|
|
||||||
|
test('request invalid version/javaVersion', async () => {
|
||||||
|
for (var combination of [
|
||||||
|
['22.3.0', '7'],
|
||||||
|
['22.3', '17'],
|
||||||
|
['22.3', '7']
|
||||||
|
]) {
|
||||||
|
let error = new Error('unexpected')
|
||||||
|
try {
|
||||||
|
await graalvm.setUpGraalVMRelease('', combination[0], combination[1])
|
||||||
|
} catch (err) {
|
||||||
|
if (!(err instanceof Error)) {
|
||||||
|
fail(`Unexpected non-Erro: ${err}`)
|
||||||
|
}
|
||||||
|
error = err
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error).not.toBeUndefined()
|
||||||
|
expect(error.message).toContain('Failed to download')
|
||||||
|
expect(error.message).toContain('Are you sure version')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
test('find version/javaVersion', async () => {
|
||||||
|
const latestRelease = await getTaggedRelease(
|
||||||
|
GRAALVM_RELEASES_REPO,
|
||||||
|
'vm-22.3.1'
|
||||||
|
)
|
||||||
|
const latestVersion = findGraalVMVersion(latestRelease)
|
||||||
|
expect(latestVersion).not.toBe('')
|
||||||
|
const latestJavaVersion = findHighestJavaVersion(latestRelease, latestVersion)
|
||||||
|
expect(latestJavaVersion).not.toBe('')
|
||||||
|
|
||||||
|
let error = new Error('unexpected')
|
||||||
|
try {
|
||||||
|
const invalidRelease = {...latestRelease, tag_name: 'invalid'}
|
||||||
|
findGraalVMVersion(invalidRelease)
|
||||||
|
} catch (err) {
|
||||||
|
if (!(err instanceof Error)) {
|
||||||
|
fail(`Unexpected non-Error: ${err}`)
|
||||||
|
}
|
||||||
|
error = err
|
||||||
|
}
|
||||||
|
expect(error.message).toContain('Could not find latest GraalVM release:')
|
||||||
|
|
||||||
|
try {
|
||||||
|
findHighestJavaVersion(latestRelease, 'invalid')
|
||||||
|
} catch (err) {
|
||||||
|
if (!(err instanceof Error)) {
|
||||||
|
fail(`Unexpected non-Erro: ${err}`)
|
||||||
|
}
|
||||||
|
error = err
|
||||||
|
}
|
||||||
|
expect(error.message).toContain('Could not find highest Java version.')
|
||||||
|
})
|
||||||
15
action.yml
15
action.yml
@@ -20,8 +20,8 @@ inputs:
|
|||||||
default: ''
|
default: ''
|
||||||
github-token:
|
github-token:
|
||||||
required: false
|
required: false
|
||||||
description: 'Set it to secrets.GITHUB_TOKEN to increase rate limits when accessing the GitHub API.'
|
description: 'Set it to secrets.GITHUB_TOKEN to increase rate limits when accessing the GitHub API. Defaults to github.token.'
|
||||||
default: ''
|
default: ${{ github.token }}
|
||||||
set-java-home:
|
set-java-home:
|
||||||
required: false
|
required: false
|
||||||
description: 'Set $JAVA_HOME to the GraalVM installation. Default: true.'
|
description: 'Set $JAVA_HOME to the GraalVM installation. Default: true.'
|
||||||
@@ -37,6 +37,17 @@ inputs:
|
|||||||
required: false
|
required: false
|
||||||
description: 'Set up musl for static image building with GraalVM Native Image.'
|
description: 'Set up musl for static image building with GraalVM Native Image.'
|
||||||
default: 'false'
|
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'
|
||||||
|
outputs:
|
||||||
|
cache-hit:
|
||||||
|
description: 'A boolean value to indicate an exact match was found for the primary key'
|
||||||
runs:
|
runs:
|
||||||
using: 'node16'
|
using: 'node16'
|
||||||
main: 'dist/main/index.js'
|
main: 'dist/main/index.js'
|
||||||
|
|||||||
26013
dist/cleanup/index.js
generated
vendored
26013
dist/cleanup/index.js
generated
vendored
File diff suppressed because one or more lines are too long
20389
dist/main/index.js
generated
vendored
20389
dist/main/index.js
generated
vendored
File diff suppressed because one or more lines are too long
6945
package-lock.json
generated
6945
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "setup-graalvm",
|
"name": "setup-graalvm",
|
||||||
"version": "1.0.8",
|
"version": "1.0.12",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "GitHub Action for GraalVM",
|
"description": "GitHub Action for GraalVM",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
@@ -11,7 +11,8 @@
|
|||||||
"lint": "eslint src/**/*.ts",
|
"lint": "eslint src/**/*.ts",
|
||||||
"package": "ncc build -o dist/main src/main.ts && ncc build -o dist/cleanup src/cleanup.ts",
|
"package": "ncc build -o dist/main src/main.ts && ncc build -o dist/cleanup src/cleanup.ts",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"all": "npm run build && npm run format && npm run lint && npm run package && npm test"
|
"all-but-test": "npm run build && npm run format && npm run lint && npm run package",
|
||||||
|
"all": "npm run all-but-test && npm test"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
"@actions/cache": "^3.0.4",
|
"@actions/cache": "^3.0.4",
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.1.0",
|
"@actions/exec": "^1.1.0",
|
||||||
|
"@actions/github": "^5.1.1",
|
||||||
"@actions/glob": "^0.3.0",
|
"@actions/glob": "^0.3.0",
|
||||||
"@actions/http-client": "^1.0.11",
|
"@actions/http-client": "^1.0.11",
|
||||||
"@actions/io": "^1.1.1",
|
"@actions/io": "^1.1.1",
|
||||||
@@ -40,7 +42,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.5.2",
|
"@types/jest": "^27.5.2",
|
||||||
"@types/node": "^17.0.6",
|
"@types/node": "^18.15.11",
|
||||||
"@types/semver": "^7.3.13",
|
"@types/semver": "^7.3.13",
|
||||||
"@types/uuid": "^8.3.4",
|
"@types/uuid": "^8.3.4",
|
||||||
"@typescript-eslint/parser": "^5.8.1",
|
"@typescript-eslint/parser": "^5.8.1",
|
||||||
@@ -48,10 +50,10 @@
|
|||||||
"eslint": "^8.6.0",
|
"eslint": "^8.6.0",
|
||||||
"eslint-plugin-github": "^4.3.5",
|
"eslint-plugin-github": "^4.3.5",
|
||||||
"eslint-plugin-jest": "^25.3.4",
|
"eslint-plugin-jest": "^25.3.4",
|
||||||
"jest": "^27.4.5",
|
"jest": "^29.5.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"prettier": "2.5.1",
|
"prettier": "2.5.1",
|
||||||
"ts-jest": "^27.1.2",
|
"ts-jest": "^29.1.0",
|
||||||
"typescript": "^4.2.3"
|
"typescript": "^5.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,8 @@
|
|||||||
|
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as constants from './constants'
|
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
|
* Check given input and run a save process for the specified package manager
|
||||||
@@ -43,7 +44,7 @@ async function saveCache(): Promise<void> {
|
|||||||
* @param promise the promise to ignore error from
|
* @param promise the promise to ignore error from
|
||||||
* @returns Promise that will ignore error reported by the given promise
|
* @returns Promise that will ignore error reported by the given promise
|
||||||
*/
|
*/
|
||||||
async function ignoreError(promise: Promise<void>): Promise<unknown> {
|
async function ignoreErrors(promise: Promise<void>): Promise<unknown> {
|
||||||
/* eslint-disable github/no-then */
|
/* eslint-disable github/no-then */
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
promise
|
promise
|
||||||
@@ -56,7 +57,8 @@ async function ignoreError(promise: Promise<void>): Promise<unknown> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function run(): Promise<void> {
|
export async function run(): Promise<void> {
|
||||||
await ignoreError(saveCache())
|
await ignoreErrors(generateReports())
|
||||||
|
await ignoreErrors(saveCache())
|
||||||
}
|
}
|
||||||
|
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const GRAALVM_ARCH = determineGraalVMArchitecture()
|
|||||||
export const GRAALVM_FILE_EXTENSION = IS_WINDOWS ? '.zip' : '.tar.gz'
|
export const GRAALVM_FILE_EXTENSION = IS_WINDOWS ? '.zip' : '.tar.gz'
|
||||||
export const GRAALVM_GH_USER = 'graalvm'
|
export const GRAALVM_GH_USER = 'graalvm'
|
||||||
export const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform
|
export const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform
|
||||||
|
export const GRAALVM_RELEASES_REPO = 'graalvm-ce-builds'
|
||||||
export const JDK_HOME_SUFFIX = IS_MACOS ? '/Contents/Home' : ''
|
export const JDK_HOME_SUFFIX = IS_MACOS ? '/Contents/Home' : ''
|
||||||
|
|
||||||
export const MANDREL_NAMESPACE = 'mandrel-'
|
export const MANDREL_NAMESPACE = 'mandrel-'
|
||||||
@@ -28,6 +29,9 @@ export const MANDREL_NAMESPACE = 'mandrel-'
|
|||||||
export const GDS_BASE = 'https://gds.oracle.com/api/20220101'
|
export const GDS_BASE = 'https://gds.oracle.com/api/20220101'
|
||||||
export const GDS_GRAALVM_PRODUCT_ID = 'D53FAE8052773FFAE0530F15000AA6C6'
|
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 =
|
export type LatestReleaseResponse =
|
||||||
otypes.Endpoints['GET /repos/{owner}/{repo}/releases/latest']['response']
|
otypes.Endpoints['GET /repos/{owner}/{repo}/releases/latest']['response']
|
||||||
|
|
||||||
|
|||||||
@@ -167,6 +167,10 @@ export async function save(id: string): Promise<void> {
|
|||||||
await cache.saveCache(packageManager.path, primaryKey)
|
await cache.saveCache(packageManager.path, primaryKey)
|
||||||
core.info(`Cache saved with the key: ${primaryKey}`)
|
core.info(`Cache saved with the key: ${primaryKey}`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
if (!(error instanceof Error)) {
|
||||||
|
core.info(`Not an Error: ${error}`)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
if (error.name === cache.ReserveCacheError.name) {
|
if (error.name === cache.ReserveCacheError.name) {
|
||||||
core.info(error.message)
|
core.info(error.message)
|
||||||
} else {
|
} else {
|
||||||
36
src/features/check-for-updates.ts
Normal file
36
src/features/check-for-updates.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import * as core from '@actions/core'
|
||||||
|
import {getTaggedRelease, toSemVer} from '../utils'
|
||||||
|
import {lt, major, minor, valid} from 'semver'
|
||||||
|
import {findGraalVMVersion} from '../graalvm'
|
||||||
|
import {GRAALVM_RELEASES_REPO} from '../constants'
|
||||||
|
|
||||||
|
export async function checkForUpdates(
|
||||||
|
graalVMVersion: string,
|
||||||
|
javaVersion: string
|
||||||
|
): Promise<void> {
|
||||||
|
if (graalVMVersion.startsWith('22.3.') && javaVersion === '11') {
|
||||||
|
core.notice(
|
||||||
|
'Please consider upgrading your project to Java 17+. GraalVM 22.3.X releases are the last to support JDK11: https://github.com/oracle/graal/issues/5063'
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const latestRelease = await getTaggedRelease(
|
||||||
|
GRAALVM_RELEASES_REPO,
|
||||||
|
'vm-22.3.1'
|
||||||
|
)
|
||||||
|
const latestGraalVMVersion = findGraalVMVersion(latestRelease)
|
||||||
|
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)}/`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,40 +1,12 @@
|
|||||||
import * as c from './constants'
|
import * as c from '../constants'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as tc from '@actions/tool-cache'
|
import * as tc from '@actions/tool-cache'
|
||||||
import {exec, toSemVer} from './utils'
|
import {exec} from '../utils'
|
||||||
import {join} from 'path'
|
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_NAME = 'x86_64-linux-musl-native'
|
||||||
const MUSL_VERSION = '10.2.1'
|
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> {
|
export async function setUpNativeImageMusl(): Promise<void> {
|
||||||
if (!c.IS_LINUX) {
|
if (!c.IS_LINUX) {
|
||||||
core.warning('musl is only supported on Linux')
|
core.warning('musl is only supported on Linux')
|
||||||
379
src/features/reports.ts
Normal file
379
src/features/reports.ts
Normal 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 async function generateReports(): Promise<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`
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ export async function downloadGraalVMEE(
|
|||||||
version: string,
|
version: string,
|
||||||
javaVersion: string
|
javaVersion: string
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const userAgent = `GraalVMGitHubAction/1.0.8 (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
|
const userAgent = `GraalVMGitHubAction/1.0.12 (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
|
||||||
const baseArtifact = await fetchArtifact(
|
const baseArtifact = await fetchArtifact(
|
||||||
userAgent,
|
userAgent,
|
||||||
'isBase:True',
|
'isBase:True',
|
||||||
|
|||||||
153
src/graalvm.ts
153
src/graalvm.ts
@@ -2,35 +2,38 @@ import * as c from './constants'
|
|||||||
import {
|
import {
|
||||||
downloadAndExtractJDK,
|
downloadAndExtractJDK,
|
||||||
downloadExtractAndCacheJDK,
|
downloadExtractAndCacheJDK,
|
||||||
getLatestRelease
|
getLatestRelease,
|
||||||
|
getTaggedRelease
|
||||||
} from './utils'
|
} from './utils'
|
||||||
import {downloadGraalVMEE} from './gds'
|
import {downloadGraalVMEE} from './gds'
|
||||||
import {downloadTool} from '@actions/tool-cache'
|
import {downloadTool} from '@actions/tool-cache'
|
||||||
|
|
||||||
const GRAALVM_CE_DL_BASE =
|
const GRAALVM_CE_DL_BASE = `https://github.com/graalvm/${c.GRAALVM_RELEASES_REPO}/releases/download`
|
||||||
'https://github.com/graalvm/graalvm-ce-builds/releases/download'
|
|
||||||
const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'
|
const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'
|
||||||
const GRAALVM_REPO_RELEASES = 'graalvm-ce-builds'
|
|
||||||
const GRAALVM_TAG_PREFIX = 'vm-'
|
const GRAALVM_TAG_PREFIX = 'vm-'
|
||||||
|
|
||||||
export async function setUpGraalVMLatest(
|
export async function setUpGraalVMLatest(
|
||||||
gdsToken: string,
|
gdsToken: string,
|
||||||
javaVersion: string
|
javaVersion: string
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
|
const lockedVersion = '22.3.1'
|
||||||
if (gdsToken.length > 0) {
|
if (gdsToken.length > 0) {
|
||||||
return setUpGraalVMRelease(gdsToken, c.VERSION_LATEST, javaVersion)
|
return setUpGraalVMRelease(gdsToken, lockedVersion, javaVersion)
|
||||||
}
|
}
|
||||||
const latestReleaseVersion = await getLatestReleaseVersion()
|
const latestRelease = await getTaggedRelease(
|
||||||
return setUpGraalVMRelease(gdsToken, latestReleaseVersion, javaVersion)
|
c.GRAALVM_RELEASES_REPO,
|
||||||
|
GRAALVM_TAG_PREFIX + lockedVersion
|
||||||
|
)
|
||||||
|
const version = findGraalVMVersion(latestRelease)
|
||||||
|
return setUpGraalVMRelease(gdsToken, version, javaVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getLatestReleaseVersion(): Promise<string> {
|
export function findGraalVMVersion(release: c.LatestReleaseResponse['data']) {
|
||||||
const latestRelease = await getLatestRelease(GRAALVM_REPO_RELEASES)
|
const tag_name = release.tag_name
|
||||||
const tag_name = latestRelease.tag_name
|
if (!tag_name.startsWith(GRAALVM_TAG_PREFIX)) {
|
||||||
if (tag_name.startsWith(GRAALVM_TAG_PREFIX)) {
|
throw new Error(`Could not find latest GraalVM release: ${tag_name}`)
|
||||||
return tag_name.substring(GRAALVM_TAG_PREFIX.length, tag_name.length)
|
|
||||||
}
|
}
|
||||||
throw new Error(`Could not find latest GraalVM release: ${tag_name}`)
|
return tag_name.substring(GRAALVM_TAG_PREFIX.length, tag_name.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setUpGraalVMDevBuild(
|
export async function setUpGraalVMDevBuild(
|
||||||
@@ -41,18 +44,14 @@ export async function setUpGraalVMDevBuild(
|
|||||||
throw new Error('Downloading GraalVM EE dev builds is not supported')
|
throw new Error('Downloading GraalVM EE dev builds is not supported')
|
||||||
}
|
}
|
||||||
const latestDevBuild = await getLatestRelease(GRAALVM_REPO_DEV_BUILDS)
|
const latestDevBuild = await getLatestRelease(GRAALVM_REPO_DEV_BUILDS)
|
||||||
const graalVMIdentifier = determineGraalVMIdentifier(
|
let resolvedJavaVersion
|
||||||
false,
|
if (javaVersion == c.VERSION_DEV) {
|
||||||
'dev',
|
resolvedJavaVersion = findHighestJavaVersion(latestDevBuild, c.VERSION_DEV)
|
||||||
javaVersion
|
} else {
|
||||||
)
|
resolvedJavaVersion = javaVersion
|
||||||
const expectedFileName = `${graalVMIdentifier}${c.GRAALVM_FILE_EXTENSION}`
|
|
||||||
for (const asset of latestDevBuild.assets) {
|
|
||||||
if (asset.name === expectedFileName) {
|
|
||||||
return downloadAndExtractJDK(asset.browser_download_url)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
throw new Error('Could not find GraalVM dev build')
|
const downloadUrl = findDownloadUrl(latestDevBuild, resolvedJavaVersion)
|
||||||
|
return downloadAndExtractJDK(downloadUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setUpGraalVMRelease(
|
export async function setUpGraalVMRelease(
|
||||||
@@ -61,34 +60,110 @@ export async function setUpGraalVMRelease(
|
|||||||
javaVersion: string
|
javaVersion: string
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
const isEE = gdsToken.length > 0
|
const isEE = gdsToken.length > 0
|
||||||
const graalVMIdentifier = determineGraalVMIdentifier(
|
const toolName = determineToolName(isEE, version, javaVersion)
|
||||||
isEE,
|
|
||||||
version,
|
|
||||||
javaVersion
|
|
||||||
)
|
|
||||||
const toolName = determineToolName(isEE, javaVersion)
|
|
||||||
let downloader: () => Promise<string>
|
let downloader: () => Promise<string>
|
||||||
if (isEE) {
|
if (isEE) {
|
||||||
downloader = async () => downloadGraalVMEE(gdsToken, version, javaVersion)
|
downloader = async () => downloadGraalVMEE(gdsToken, version, javaVersion)
|
||||||
} else {
|
} else {
|
||||||
const downloadUrl = `${GRAALVM_CE_DL_BASE}/${GRAALVM_TAG_PREFIX}${version}/${graalVMIdentifier}${c.GRAALVM_FILE_EXTENSION}`
|
downloader = async () => downloadGraalVMCE(version, javaVersion)
|
||||||
downloader = async () => downloadTool(downloadUrl)
|
|
||||||
}
|
}
|
||||||
return downloadExtractAndCacheJDK(downloader, toolName, version)
|
return downloadExtractAndCacheJDK(downloader, toolName, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function findHighestJavaVersion(
|
||||||
|
release: c.LatestReleaseResponse['data'],
|
||||||
|
version: string
|
||||||
|
): string {
|
||||||
|
const graalVMIdentifierPattern = determineGraalVMIdentifier(
|
||||||
|
false,
|
||||||
|
version,
|
||||||
|
'(\\d+)'
|
||||||
|
)
|
||||||
|
const expectedFileNameRegExp = new RegExp(
|
||||||
|
`^${graalVMIdentifierPattern}${c.GRAALVM_FILE_EXTENSION.replace(
|
||||||
|
/\./g,
|
||||||
|
'\\.'
|
||||||
|
)}$`
|
||||||
|
)
|
||||||
|
let highestJavaVersion = 0
|
||||||
|
for (const asset of release.assets) {
|
||||||
|
const matches = asset.name.match(expectedFileNameRegExp)
|
||||||
|
if (matches) {
|
||||||
|
const javaVersion = +matches[1]
|
||||||
|
if (javaVersion > highestJavaVersion) {
|
||||||
|
highestJavaVersion = javaVersion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (highestJavaVersion > 0) {
|
||||||
|
return String(highestJavaVersion)
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
'Could not find highest Java version. Please file an issue at: https://github.com/graalvm/setup-graalvm/issues.'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findDownloadUrl(
|
||||||
|
release: c.LatestReleaseResponse['data'],
|
||||||
|
javaVersion: string
|
||||||
|
): string {
|
||||||
|
const graalVMIdentifier = determineGraalVMIdentifier(
|
||||||
|
false,
|
||||||
|
c.VERSION_DEV,
|
||||||
|
javaVersion
|
||||||
|
)
|
||||||
|
const expectedFileName = `${graalVMIdentifier}${c.GRAALVM_FILE_EXTENSION}`
|
||||||
|
for (const asset of release.assets) {
|
||||||
|
if (asset.name === expectedFileName) {
|
||||||
|
return asset.browser_download_url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
`Could not find GraalVM dev build for Java ${javaVersion}. It may no longer be available, so please consider upgrading the Java version. If you think this is a mistake, please file an issue at: https://github.com/graalvm/setup-graalvm/issues.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function determineGraalVMIdentifier(
|
function determineGraalVMIdentifier(
|
||||||
isEE: boolean,
|
isEE: boolean,
|
||||||
version: string,
|
version: string,
|
||||||
javaVersion: string
|
javaVersion: string
|
||||||
): string {
|
): string {
|
||||||
return `graalvm-${isEE ? 'ee' : 'ce'}-java${javaVersion}-${
|
return `${determineToolName(isEE, version, javaVersion)}-${
|
||||||
c.GRAALVM_PLATFORM
|
c.GRAALVM_ARCH
|
||||||
}-${c.GRAALVM_ARCH}-${version}`
|
}-${version}`
|
||||||
}
|
}
|
||||||
|
|
||||||
function determineToolName(isEE: boolean, javaVersion: string): string {
|
function determineToolName(
|
||||||
return `graalvm-${isEE ? 'ee' : 'ce'}-java${javaVersion}-${
|
isEE: boolean,
|
||||||
c.GRAALVM_PLATFORM
|
version: string,
|
||||||
}`
|
javaVersion: string
|
||||||
|
): string {
|
||||||
|
const infix = isEE ? 'ee' : version === c.VERSION_DEV ? 'community' : 'ce'
|
||||||
|
return `graalvm-${infix}-java${javaVersion}-${c.GRAALVM_PLATFORM}`
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadGraalVMCE(
|
||||||
|
version: string,
|
||||||
|
javaVersion: string
|
||||||
|
): Promise<string> {
|
||||||
|
const graalVMIdentifier = determineGraalVMIdentifier(
|
||||||
|
false,
|
||||||
|
version,
|
||||||
|
javaVersion
|
||||||
|
)
|
||||||
|
const downloadUrl = `${GRAALVM_CE_DL_BASE}/${GRAALVM_TAG_PREFIX}${version}/${graalVMIdentifier}${c.GRAALVM_FILE_EXTENSION}`
|
||||||
|
try {
|
||||||
|
return await downloadTool(downloadUrl)
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error && error.message.includes('404')) {
|
||||||
|
// Not Found
|
||||||
|
throw new Error(
|
||||||
|
`Failed to download ${graalVMIdentifier}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
`Failed to download ${graalVMIdentifier} (error: ${error}).`
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/main.ts
13
src/main.ts
@@ -3,12 +3,14 @@ import * as core from '@actions/core'
|
|||||||
import * as graalvm from './graalvm'
|
import * as graalvm from './graalvm'
|
||||||
import {isFeatureAvailable as isCacheAvailable} from '@actions/cache'
|
import {isFeatureAvailable as isCacheAvailable} from '@actions/cache'
|
||||||
import {join} from 'path'
|
import {join} from 'path'
|
||||||
import {restore} from './cache'
|
import {restore} from './features/cache'
|
||||||
import {setUpDependencies} from './dependencies'
|
import {setUpDependencies} from './dependencies'
|
||||||
import {setUpGUComponents} from './gu'
|
import {setUpGUComponents} from './gu'
|
||||||
import {setUpMandrel} from './mandrel'
|
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 {setUpWindowsEnvironment} from './msvc'
|
||||||
|
import {setUpNativeImageBuildReports} from './features/reports'
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
async function run(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
@@ -17,7 +19,9 @@ async function run(): Promise<void> {
|
|||||||
const javaVersion = core.getInput(c.INPUT_JAVA_VERSION, {required: true})
|
const javaVersion = core.getInput(c.INPUT_JAVA_VERSION, {required: true})
|
||||||
const componentsString: string = core.getInput(c.INPUT_COMPONENTS)
|
const componentsString: string = core.getInput(c.INPUT_COMPONENTS)
|
||||||
const components: string[] =
|
const components: string[] =
|
||||||
componentsString.length > 0 ? componentsString.split(',') : []
|
componentsString.length > 0
|
||||||
|
? componentsString.split(',').map(x => x.trim())
|
||||||
|
: []
|
||||||
const setJavaHome = core.getInput(c.INPUT_SET_JAVA_HOME) === 'true'
|
const setJavaHome = core.getInput(c.INPUT_SET_JAVA_HOME) === 'true'
|
||||||
const cache = core.getInput(c.INPUT_CACHE)
|
const cache = core.getInput(c.INPUT_CACHE)
|
||||||
const enableCheckForUpdates =
|
const enableCheckForUpdates =
|
||||||
@@ -25,7 +29,7 @@ async function run(): Promise<void> {
|
|||||||
const enableNativeImageMusl = core.getInput(c.INPUT_NI_MUSL) === 'true'
|
const enableNativeImageMusl = core.getInput(c.INPUT_NI_MUSL) === 'true'
|
||||||
|
|
||||||
if (c.IS_WINDOWS) {
|
if (c.IS_WINDOWS) {
|
||||||
setUpWindowsEnvironment()
|
setUpWindowsEnvironment(graalvmVersion)
|
||||||
}
|
}
|
||||||
await setUpDependencies(components)
|
await setUpDependencies(components)
|
||||||
if (enableNativeImageMusl) {
|
if (enableNativeImageMusl) {
|
||||||
@@ -79,6 +83,7 @@ async function run(): Promise<void> {
|
|||||||
if (cache && isCacheAvailable()) {
|
if (cache && isCacheAvailable()) {
|
||||||
await restore(cache)
|
await restore(cache)
|
||||||
}
|
}
|
||||||
|
setUpNativeImageBuildReports(graalvmVersion)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof Error) core.setFailed(error.message)
|
if (error instanceof Error) core.setFailed(error.message)
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/msvc.ts
23
src/msvc.ts
@@ -1,18 +1,25 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import {execSync} from 'child_process'
|
import {execSync} from 'child_process'
|
||||||
import {existsSync} from 'fs'
|
import {existsSync} from 'fs'
|
||||||
|
import {VERSION_DEV} from './constants'
|
||||||
|
|
||||||
// Keep in sync with https://github.com/actions/virtual-environments
|
// Keep in sync with https://github.com/actions/virtual-environments
|
||||||
const KNOWN_VISUAL_STUDIO_INSTALLATIONS = [
|
const KNOWN_VISUAL_STUDIO_INSTALLATIONS = [
|
||||||
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise', // 'windows-2016'
|
'C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise', // 'windows-2022' and 'windows-latest'
|
||||||
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise', // 'windows-2019' and 'windows-latest'
|
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise', // 'windows-2019'
|
||||||
'C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise' // 'windows-2022'
|
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise' // 'windows-2016' (deprecated and removed)
|
||||||
]
|
]
|
||||||
const VCVARSALL_SUBPATH = '\\VC\\Auxiliary\\Build\\vcvarsall.bat'
|
if (process.env['VSINSTALLDIR']) {
|
||||||
|
// if VSINSTALLDIR is set, make it the first known installation
|
||||||
|
KNOWN_VISUAL_STUDIO_INSTALLATIONS.unshift(
|
||||||
|
process.env['VSINSTALLDIR'].replace(/\\$/, '')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const VCVARSALL_SUBPATH = 'VC\\Auxiliary\\Build\\vcvarsall.bat'
|
||||||
|
|
||||||
function findVcvarsallPath(): string {
|
function findVcvarsallPath(): string {
|
||||||
for (const installation of KNOWN_VISUAL_STUDIO_INSTALLATIONS) {
|
for (const installation of KNOWN_VISUAL_STUDIO_INSTALLATIONS) {
|
||||||
const candidate = `${installation}${VCVARSALL_SUBPATH}`
|
const candidate = `${installation}\\${VCVARSALL_SUBPATH}`
|
||||||
if (existsSync(candidate)) {
|
if (existsSync(candidate)) {
|
||||||
return candidate
|
return candidate
|
||||||
}
|
}
|
||||||
@@ -20,7 +27,11 @@ function findVcvarsallPath(): string {
|
|||||||
throw new Error('Failed to find vcvarsall.bat')
|
throw new Error('Failed to find vcvarsall.bat')
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setUpWindowsEnvironment(): void {
|
export function setUpWindowsEnvironment(graalVMVersion: string): void {
|
||||||
|
if (graalVMVersion === VERSION_DEV) {
|
||||||
|
return // no longer required in dev builds
|
||||||
|
}
|
||||||
|
|
||||||
core.startGroup('Updating Windows environment...')
|
core.startGroup('Updating Windows environment...')
|
||||||
|
|
||||||
const vcvarsallPath = findVcvarsallPath()
|
const vcvarsallPath = findVcvarsallPath()
|
||||||
|
|||||||
53
src/utils.ts
53
src/utils.ts
@@ -1,5 +1,6 @@
|
|||||||
import * as c from './constants'
|
import * as c from './constants'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
import * as github from '@actions/github'
|
||||||
import * as httpClient from '@actions/http-client'
|
import * as httpClient from '@actions/http-client'
|
||||||
import * as tc from '@actions/tool-cache'
|
import * as tc from '@actions/tool-cache'
|
||||||
import {ExecOptions, exec as e} from '@actions/exec'
|
import {ExecOptions, exec as e} from '@actions/exec'
|
||||||
@@ -8,9 +9,9 @@ import {Octokit} from '@octokit/core'
|
|||||||
import {createHash} from 'crypto'
|
import {createHash} from 'crypto'
|
||||||
import {join} from 'path'
|
import {join} from 'path'
|
||||||
|
|
||||||
// Set up Octokit in the same way as @actions/github (see https://git.io/Jy9YP)
|
// Set up Octokit for github.com only and in the same way as @actions/github (see https://git.io/Jy9YP)
|
||||||
const baseUrl = process.env['GITHUB_API_URL'] || 'https://api.github.com'
|
const baseUrl = 'https://api.github.com'
|
||||||
const GitHub = Octokit.defaults({
|
const GitHubDotCom = Octokit.defaults({
|
||||||
baseUrl,
|
baseUrl,
|
||||||
request: {
|
request: {
|
||||||
agent: new httpClient.HttpClient().getAgent(baseUrl)
|
agent: new httpClient.HttpClient().getAgent(baseUrl)
|
||||||
@@ -35,9 +36,9 @@ export async function exec(
|
|||||||
export async function getLatestRelease(
|
export async function getLatestRelease(
|
||||||
repo: string
|
repo: string
|
||||||
): Promise<c.LatestReleaseResponse['data']> {
|
): Promise<c.LatestReleaseResponse['data']> {
|
||||||
const githubToken = core.getInput('github-token')
|
const githubToken = getGitHubToken()
|
||||||
const options = githubToken.length > 0 ? {auth: githubToken} : {}
|
const options = githubToken.length > 0 ? {auth: githubToken} : {}
|
||||||
const octokit = new GitHub(options)
|
const octokit = new GitHubDotCom(options)
|
||||||
return (
|
return (
|
||||||
await octokit.request('GET /repos/{owner}/{repo}/releases/latest', {
|
await octokit.request('GET /repos/{owner}/{repo}/releases/latest', {
|
||||||
owner: c.GRAALVM_GH_USER,
|
owner: c.GRAALVM_GH_USER,
|
||||||
@@ -46,6 +47,22 @@ export async function getLatestRelease(
|
|||||||
).data
|
).data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getTaggedRelease(
|
||||||
|
repo: string,
|
||||||
|
tag: string
|
||||||
|
): Promise<c.LatestReleaseResponse['data']> {
|
||||||
|
const githubToken = getGitHubToken()
|
||||||
|
const options = githubToken.length > 0 ? {auth: githubToken} : {}
|
||||||
|
const octokit = new GitHubDotCom(options)
|
||||||
|
return (
|
||||||
|
await octokit.request('GET /repos/{owner}/{repo}/releases/tags/{tag}', {
|
||||||
|
owner: c.GRAALVM_GH_USER,
|
||||||
|
repo,
|
||||||
|
tag
|
||||||
|
})
|
||||||
|
).data
|
||||||
|
}
|
||||||
|
|
||||||
export async function downloadAndExtractJDK(
|
export async function downloadAndExtractJDK(
|
||||||
downloadUrl: string
|
downloadUrl: string
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
@@ -112,3 +129,29 @@ export function toSemVer(version: string): string {
|
|||||||
const patch = parts.length > 2 ? parts.slice(2).join('-') : '0'
|
const patch = parts.length > 2 ? parts.slice(2).join('-') : '0'
|
||||||
return `${major}.${minor}.${patch}`
|
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
|
||||||
|
try {
|
||||||
|
await github.getOctokit(getGitHubToken()).rest.issues.createComment({
|
||||||
|
...context.repo,
|
||||||
|
issue_number: context.payload.pull_request?.number as number,
|
||||||
|
body: content
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
core.error(
|
||||||
|
`Failed to create pull request comment. Please make sure this job has 'write' permissions for the 'pull-requests' scope (see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions)? Internal error: ${err}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user