Compare commits

...

39 Commits

Author SHA1 Message Date
dependabot[bot]
9b79636afc Bump typescript from 5.6.2 to 5.6.3 (#294)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.6.2 to 5.6.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.6.2...v5.6.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-10-09 01:03:07 -04:00
dependabot[bot]
0360370b20 Bump @vercel/ncc from 0.38.1 to 0.38.2 (#287)
* Bump @vercel/ncc from 0.38.1 to 0.38.2

Bumps [@vercel/ncc](https://github.com/vercel/ncc) from 0.38.1 to 0.38.2.
- [Release notes](https://github.com/vercel/ncc/releases)
- [Commits](https://github.com/vercel/ncc/compare/0.38.1...0.38.2)

---
updated-dependencies:
- dependency-name: "@vercel/ncc"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* npm ci && npm run build && npm run pack

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-10-09 00:51:41 -04:00
dependabot[bot]
4e3f1d687a Bump @actions/core from 1.10.1 to 1.11.1 (#291)
* Bump @actions/core from 1.10.1 to 1.11.1

Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.10.1 to 1.11.1.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

---
updated-dependencies:
- dependency-name: "@actions/core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* npm ci && npm run build && npm run pack

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-10-09 00:37:20 -04:00
Ian Butterworth
1068b5ed3f Change LTS 1.6 -> 1.10 (#290) 2024-10-09 00:30:04 -04:00
dependabot[bot]
f42f7fb072 Bump @types/async-retry from 1.4.8 to 1.4.9 (#292)
Bumps [@types/async-retry](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async-retry) from 1.4.8 to 1.4.9.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async-retry)

---
updated-dependencies:
- dependency-name: "@types/async-retry"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-10-08 17:32:27 -04:00
dependabot[bot]
a06d998188 Bump @types/node from 22.6.1 to 22.7.5 (#293)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.6.1 to 22.7.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-08 16:57:26 -04:00
dependabot[bot]
83c1b1f3c9 Bump julia-actions/setup-julia from 2.3.0 to 2.5.0 (#285)
* Bump julia-actions/setup-julia from 2.3.0 to 2.5.0

Bumps [julia-actions/setup-julia](https://github.com/julia-actions/setup-julia) from 2.3.0 to 2.5.0.
- [Release notes](https://github.com/julia-actions/setup-julia/releases)
- [Changelog](https://github.com/julia-actions/setup-julia/blob/master/devdocs/making_a_new_release.md)
- [Commits](780022b48d...a0a0978e28)

---
updated-dependencies:
- dependency-name: julia-actions/setup-julia
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add comments that contain the tag (version number)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-09-23 20:19:49 -04:00
Dilum Aluthge
be1659352d arch input: accept x86_64 as a synonym for x64 (#264)
* `arch` input: accept `x86_64` as a synonym for `x64`

* npm ci && npm run build && npm run pack
2024-09-23 19:35:48 -04:00
dependabot[bot]
d6ffb3065b Bump typescript from 5.5.4 to 5.6.2 (#286)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.5.4 to 5.6.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.5.4...v5.6.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 19:09:04 -04:00
dependabot[bot]
95d7bc0174 Bump @types/jest from 29.5.12 to 29.5.13 (#288)
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 29.5.12 to 29.5.13.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

---
updated-dependencies:
- dependency-name: "@types/jest"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 18:51:09 -04:00
dependabot[bot]
6cb24233ff Bump @types/node from 22.5.1 to 22.6.1 (#284)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.5.1 to 22.6.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 18:30:25 -04:00
Dilum Aluthge
a0a0978e28 Simplify the release process (no more build script or release branches) (#281)
* Simplify the release process (no more build script or release branches)

* Remove the `bin/` submodule

* npm run pack

* Use a different YAML syntax

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

* Use simpler (but equivalent) logic

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

* Fix a logic bug

* Remove some job matrices

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>

* Intentionally fail a job (to make sure that `finalize` thus also fails)

* Revert "Intentionally fail a job (to make sure that `finalize` thus also fails)"

This reverts commit cd7944ca82.

---------

Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>
2024-09-23 18:17:15 -04:00
Ian Butterworth
54be0dc244 Update version on master (#279) 2024-08-31 09:10:59 -04:00
Curtis Vogt
014c323ee0 Resolve min as the earliest compatible Julia version (compatible with the user's project) (#202)
* Support the special version "MIN"

* Support JULIA_PROJECT

* Add tests

* Add forgotten test fixtures

* Get latest prerelease/release

* No special pre-release behaviour

* Add test for NPM semver difference

* Robust test suite

* Disallow less-than-equal

* Refactor validJuliaCompatRange to return a validRange

* Rename MIN to min

* Rename getProjectFile to getProjectFilePath

* Comment on "project" input

* Additional tests for getProjectFilePath

* Add comment on `juliaCompatRange`

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Update dependencies

---------

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-08-30 10:58:16 -05:00
dependabot[bot]
b83c8a20db Bump @types/node from 20.14.11 to 22.5.1 (#277)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.11 to 22.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-30 11:29:53 -04:00
dependabot[bot]
8c3db01273 Bump ts-jest from 29.2.3 to 29.2.5 (#276)
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.2.3 to 29.2.5.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.2.3...v29.2.5)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-30 15:18:26 +00:00
dependabot[bot]
f8f6acf37c Bump typescript from 5.5.3 to 5.5.4 (#275)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.5.3 to 5.5.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.5.3...v5.5.4)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-30 11:08:29 -04:00
dependabot[bot]
f2dfec4deb Bump bin from e564658 to 0f674f3 (#272)
Bumps [bin](https://github.com/julia-actions/bin) from `e564658` to `0f674f3`.
- [Commits](e564658c0f...0f674f357d)

---
updated-dependencies:
- dependency-name: bin
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-21 20:17:53 -04:00
Dilum Aluthge
3bc2a872da package.json: change version number from 2.2.0 to 2.3.0 (#271)
* `package.json`: change version number from `2.2.0` to `2.3.0`

* `rm -rf node_modules/ && npm ci && npm install`
2024-07-21 17:24:46 -04:00
Ian Butterworth
0c4130534d Improve example version instructions. Add info about "lts" if user specifies 1.6 explicitly (#265)
* improve example versions and note

* add info if user explicitly sets version to 1.6

* npm run build

* add 1.6 explicitly to CI

* convert to a github actions notice

* try core.notice

* npm run build

* Apply suggestions from code review

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Update action.yml

* update example

* update toc

* npm build

---------

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-07-21 11:11:51 -04:00
Dilum Aluthge
5956f5ed17 If the user provides default as the value of the arch input, use the runner machine's architecture (#263)
* If the user provides `default` as the value of the `arch` input, use the runner machine's architecture

* `npm run build`

* Convert the key `processedArchInput` to lower case before indexing into the `archSynonyms` dict

* `npm run build`

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-07-21 10:58:40 +00:00
dependabot[bot]
a9e17d5c78 Bump prettier from 3.3.2 to 3.3.3 (#269)
Bumps [prettier](https://github.com/prettier/prettier) from 3.3.2 to 3.3.3.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.3.2...3.3.3)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-19 22:16:16 -04:00
dependabot[bot]
f2f2b89a9f Bump ts-jest from 29.1.5 to 29.2.3 (#268)
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.1.5 to 29.2.3.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.1.5...v29.2.3)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-20 02:08:37 +00:00
dependabot[bot]
f9eef78196 Bump semver from 7.6.2 to 7.6.3 (#270)
Bumps [semver](https://github.com/npm/node-semver) from 7.6.2 to 7.6.3.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.6.2...v7.6.3)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-20 01:59:18 +00:00
dependabot[bot]
3511533b57 Bump typescript from 5.4.5 to 5.5.3 (#258)
* Bump typescript from 5.4.5 to 5.5.3

Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.4.5 to 5.5.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.4.5...v5.5.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* npm run build

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-07-19 20:10:17 +00:00
Dilum Aluthge
8db9e52340 CI: don't instruct the user to do npm run format (#267) 2024-07-19 16:04:23 -04:00
Dilum Aluthge
1da1716a18 Improve the error logging for the case of Julia 1.6 or 1.7 on Apple Silicon (macos-latest or macos-14) (#261)
* Add some more error logging

* `npm run build`

* Make the message more concise

* Remove the trailing newline at the very end of the last line of the error message

* `npm ci && npm run build`
2024-07-19 19:46:12 +00:00
dependabot[bot]
7653693003 Bump bin from 31b4b50 to e564658 (#259)
Bumps [bin](https://github.com/julia-actions/bin) from `31b4b50` to `e564658`.
- [Commits](31b4b500a3...e564658c0f)

---
updated-dependencies:
- dependency-name: bin
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-07-19 19:19:27 +00:00
dependabot[bot]
e1580df3b6 Bump @types/node from 20.14.6 to 20.14.11 (#266)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.6 to 20.14.11.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-19 15:10:57 -04:00
Dilum Aluthge
ba42af3a54 Always print an error message, never error silently (#262)
* Always print an error message, never error silently

* `npm run build`
2024-07-18 11:30:05 -04:00
Viral B. Shah
4778d3d0c8 Update README.md (#256) 2024-06-26 18:03:36 -04:00
Ian Butterworth
c7aa298e32 update version 2.0.0 -> 2.2.0 (#255) 2024-06-26 15:54:53 -04:00
Dilum Aluthge
cae3c21ea1 Make the devdocs more complete and self-contained (#252)
* Make the devdocs more complete and self-contained

* Rename devdocs/misc-notes-from-contributors.md to devdocs/misc/misc_notes_for_committers.md

* Document the dependencies of the build script

* No need to manually make multiple commits

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>
2024-06-26 18:18:44 +00:00
Kristoffer Carlsson
389de5c0df Allow lts for the LTS, and allow pre for the latest pre-release (#234)
* update tests to latest `versions.json`

* allow specifying the version as `lts` to install the latest LTS version

for now, this just hardcodes the LTS version in the source (similar to how juliaup does it) since the latest LTS is not available in `versions.json`. Since the LTS is updated so rarely this might be ok for now.

* add a 'pre' version

* Run `npm ci` followed by `npm run build`

* Add a CI job to test `pre`

---------

Co-authored-by: Viral B. Shah <ViralBShah@users.noreply.github.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>
2024-06-26 14:12:52 -04:00
Dilum Aluthge
42e03d3446 CI: Install the same version of NodeJS that is specified in .tool-versions (#253)
* Create a `.tool-versions` file with an entry for NodeJS 20

* CI: Install the same version of NodeJS that is specified in `.tool-versions`
2024-06-19 19:09:08 -04:00
dependabot[bot]
e62bf8c418 Bump ts-jest from 29.1.2 to 29.1.5 (#249)
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.1.2 to 29.1.5.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.1.2...v29.1.5)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 22:59:37 +00:00
dependabot[bot]
30038810d2 Bump prettier from 3.2.5 to 3.3.2 (#247)
Bumps [prettier](https://github.com/prettier/prettier) from 3.2.5 to 3.3.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 22:49:01 +00:00
dependabot[bot]
0e4b558b25 Bump semver from 7.6.0 to 7.6.2 (#244)
Bumps [semver](https://github.com/npm/node-semver) from 7.6.0 to 7.6.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.6.0...v7.6.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 22:40:25 +00:00
dependabot[bot]
3599cbd45f Bump @types/node from 20.12.8 to 20.14.6 (#254)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.12.8 to 20.14.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 22:29:43 +00:00
32 changed files with 59455 additions and 7864 deletions

View File

@@ -1,36 +0,0 @@
name: "PR Checks"
on: [pull_request, push]
concurrency:
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
# Cancel intermediate builds: only pull request builds
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
jobs:
check_pr:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: "npm ci"
run: npm ci
- name: "npm run build"
run: npm run build
- name: "npm run test"
run: npm run test
- name: "check for uncommitted changes"
# Ensure no changes, but ignore node_modules dir since dev/fresh ci deps installed.
run: |
git diff --exit-code --stat -- . ':!node_modules' \
|| (echo "##[error] found changed files after build. please 'npm run build && npm run format'" \
"and check in all changes" \
&& exit 1)

View File

@@ -28,7 +28,7 @@ jobs:
- uses: actions/setup-node@v4
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
with:
node-version: 16
node-version-file: '.tool-versions'
- name: "Install dependencies"
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}

View File

@@ -34,7 +34,7 @@ jobs:
- uses: actions/setup-node@v4
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
with:
node-version: 16
node-version-file: '.tool-versions'
- name: "Install dependencies"
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}

View File

@@ -34,7 +34,7 @@ jobs:
- uses: actions/setup-node@v4
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
with:
node-version: 16
node-version-file: '.tool-versions'
- name: "Install dependencies"
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}

View File

@@ -19,7 +19,8 @@ jobs:
strategy:
fail-fast: false
matrix:
julia-version: ['1.0.5', '1.2', '^1.5.0-beta1', '1']
# include '1.6' here to test info message about lts tag existing
julia-version: ['1.0.5', '1.2', '^1.5.0-beta1', '1', '1.6', 'lts', 'pre']
julia-arch: [x64, x86]
os: [ubuntu-latest, macOS-latest, windows-latest]
# 32-bit Julia binaries are not available on macOS
@@ -33,7 +34,7 @@ jobs:
- uses: actions/setup-node@v4
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
with:
node-version: 16
node-version-file: '.tool-versions'
- name: "Install dependencies"
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}

222
.github/workflows/pr_checks.yml vendored Normal file
View File

@@ -0,0 +1,222 @@
name: PR Checks
on:
pull_request:
push:
branches:
- master
tags: '*'
concurrency:
# Skip intermediate builds: all builds except for builds on the `master` branch
# Cancel intermediate builds: only pull request builds
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.run_number }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
permissions:
contents: read
jobs:
finalize-pr-checks:
if: always() # this line is important to keep the `finalize` job from being marked as skipped; do not change or delete this line
runs-on: ubuntu-latest
timeout-minutes: 10
needs:
- checked-in-files
- build
- npm-run-test
- make-targets
- stalecheck-npm-install
steps:
- run: |
echo checked-in-files: ${{ needs.checked-in-files.result }}
echo build: ${{ needs.build.result }}
echo npm-run-test: ${{ needs.npm-run-test.result }}
echo make-targets: ${{ needs.make-targets.result }}
echo stalecheck-npm-install: ${{ needs.stalecheck-npm-install.result }}
- run: exit 1
if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}
checked-in-files:
timeout-minutes: 30
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
### Check out the repo:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
persist-credentials: false
### Cleanall:
- run: make cleanall
### Install NodeJS
# Unix (non-Windows):
- uses: asdf-vm/actions/setup@05e0d2ed97b598bfce82fd30daf324ae0c4570e6
if: runner.os != 'Windows'
- run: make unix-asdf-install
if: runner.os != 'Windows'
# Windows:
# Windows does not support asdf, so we have to use `actions/setup-node`
# to install asdf:
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b
if: runner.os == 'Windows'
with:
node-version-file: '.tool-versions'
### Install the NodeJS packages that we depend on:
- run: make install-packages
### Print some debugging info:
- name: Print the NodeJS version (for debugging)
run: |
which -a node
node --version
which -a npm
npm --version
### Build:
- run: make pack
### Clean (not cleanall!):
- run: make clean
### Make sure there are no uncommited changes
- uses: julia-actions/setup-julia@a0a0978e28861c11a3490cee468f87d5b568851a # v2.5.0
with:
version: '1'
- run: git --no-pager status
- run: git --no-pager diff
- run: julia ./ci/check_uncommitted_changes.jl
build:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
### Check out the repo:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
persist-credentials: false
### Cleanall:
- run: make cleanall
### Install NodeJS
# Unix (non-Windows):
- uses: asdf-vm/actions/setup@05e0d2ed97b598bfce82fd30daf324ae0c4570e6
if: runner.os != 'Windows'
- run: make unix-asdf-install
if: runner.os != 'Windows'
# Windows:
# Windows does not support asdf, so we have to use `actions/setup-node`
# to install asdf:
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b
if: runner.os == 'Windows'
with:
node-version-file: '.tool-versions'
### Install the NodeJS packages that we depend on:
- run: make install-packages
### Print some debugging info:
- name: Print the NodeJS version (for debugging)
run: |
which -a node
node --version
which -a npm
npm --version
### Build:
- run: make build
- run: make pack
### Make sure some other `make` targets don't bitrot:
- name: Run some other `make` targets to ensure that they don't bitrot
run: |
make clean
make cleanall
- name: Run all of the "cleaning" `make` targets to ensure that they don't bitrot
run: |
make clean
make cleanall
npm-run-test:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
### Check out the repo:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
persist-credentials: false
### Cleanall:
- run: make cleanall
### Install NodeJS
# Unix (non-Windows):
- uses: asdf-vm/actions/setup@05e0d2ed97b598bfce82fd30daf324ae0c4570e6
if: runner.os != 'Windows'
- run: make unix-asdf-install
if: runner.os != 'Windows'
# Windows:
# Windows does not support asdf, so we have to use `actions/setup-node`
# to install asdf:
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b
if: runner.os == 'Windows'
with:
node-version-file: '.tool-versions'
### Install the NodeJS packages that we depend on:
- run: make install-packages
### Print some debugging info:
- name: Print the NodeJS version (for debugging)
run: |
which -a node
node --version
which -a npm
npm --version
### Build:
- run: make build
- run: make test
make-targets: # This is a job to make sure that none of the `make` targets bitrot
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
### Check out the repo:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
persist-credentials: false
### Cleanall:
- run: make cleanall
### Install NodeJS
# Unix (non-Windows):
- uses: asdf-vm/actions/setup@05e0d2ed97b598bfce82fd30daf324ae0c4570e6
if: runner.os != 'Windows'
- run: make unix-asdf-install
if: runner.os != 'Windows'
### Install the NodeJS packages that we depend on:
- run: make install-packages
### Make sure some other `make` targets don't bitrot:
- name: Run some other `make` targets to ensure that they don't bitrot
run: |
make unix-asdf-install
make install-packages
make build
make pack
make everything-from-scratch
- name: Run all of the "cleaning" `make` targets to ensure that they don't bitrot
run: |
make clean
make cleanall
stalecheck-npm-install:
# In this job, we are basically trying to check if `package-lock.json` is in
# sync with `package-lock.json`.
#
# So, for example, if someone manually edits the `package.json` file, we want
# to make sure that the `package-lock.json` file is not out of sync with the
# `package.json` file.
timeout-minutes: 30
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
### Check out the repo:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
with:
persist-credentials: false
### Install NodeJS
# Unix (non-Windows):
- uses: asdf-vm/actions/setup@05e0d2ed97b598bfce82fd30daf324ae0c4570e6
if: runner.os != 'Windows'
- run: make unix-asdf-install
if: runner.os != 'Windows'
### Run the master commands for this job:
- run: make clean
- run: npm ci
# - run: npm install --package-lock-only
- run: npm install
### Make sure there are no uncommited changes
- uses: julia-actions/setup-julia@a0a0978e28861c11a3490cee468f87d5b568851a # v2.5.0
with:
version: '1'
- run: git --no-pager status
- run: git --no-pager diff
- run: julia ./ci/check_uncommitted_changes.jl

1
.gitignore vendored
View File

@@ -1,3 +1,2 @@
node_modules/
__tests__/runner/*
dist/

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "bin"]
path = bin
url = git@github.com:julia-actions/bin.git

1
.tool-versions Normal file
View File

@@ -0,0 +1 @@
nodejs 20.11.1

View File

@@ -1,11 +1,3 @@
# Dev docs / Contributing guide
# Contributing
## Building and tagging a release (requires write access)
1. Test your changes, merge into `master`.
2. Checkout `master`.
3. Bump the version number in [`package.json`](package.json).
4. Run `./bin/build-release julia-actions/setup-julia` to create a release branch and build a release.
5. Push the branch (**without tags**) and verify that CI is passing on it.
6. Run `git push --tags --force` to update the tags.
7. Create a release for the `vX.Y.Z` tag.
Please see the README in the [`devdocs/`](devdocs/) folder.

49
Makefile Normal file
View File

@@ -0,0 +1,49 @@
.NOTPARALLEL:
# This is the default target:
.PHONY: pack
pack: build
npm run pack
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.PHONY: everything-from-scratch
everything-from-scratch: cleanall install-packages build pack clean
# build does `npm run build`, but does not run `npm run pack`
.PHONY: build
build:
npm run build
.PHONY: test
test:
npm run test
.PHONY: install-packages
install-packages:
rm -rf node_modules/
# Note: we use `npm ci` instead of `npm install`, because we want to make sure
# that we respect the versions in the `package-lock.json` lockfile.
npm ci
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.PHONY: clean
clean:
rm -rf node_modules/
.PHONY: cleanall
cleanall: clean
rm -rf lib/
rm -rf dist/
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# asdf does not support Windows.
# On Windows, users need to install the correct version of NodeJS themselves.
.PHONY: unix-asdf-install
unix-asdf-install:
asdf plugin add nodejs # update this list when we add more tools to `.tool-versions`
asdf install
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

View File

@@ -5,17 +5,25 @@
This action sets up a Julia environment for use in actions by downloading a specified version of Julia and adding it to PATH.
## Table of Contents
- [Table of Contents](#table-of-contents)
- [Usage](#usage)
- [Inputs](#inputs)
- [Outputs](#outputs)
- [Basic](#basic)
- [Julia Versions](#julia-versions)
- [Matrix Testing](#matrix-testing)
- [versioninfo](#versioninfo)
- [Versioning](#versioning)
- [Debug logs](#debug-logs)
- [Third party information](#third-party-information)
- [setup-julia Action](#setup-julia-action)
- [Table of Contents](#table-of-contents)
- [Usage](#usage)
- [Inputs](#inputs)
- [Outputs](#outputs)
- [Basic](#basic)
- [Julia Versions](#julia-versions)
- [Examples](#examples)
- [Prereleases](#prereleases)
- [Recently released versions](#recently-released-versions)
- [Matrix Testing](#matrix-testing)
- [64-bit Julia only](#64-bit-julia-only)
- [32-bit Julia](#32-bit-julia)
- [versioninfo](#versioninfo)
- [Versioning](#versioning)
- [Using Dependabot version updates to keep your GitHub Actions up to date](#using-dependabot-version-updates-to-keep-your-github-actions-up-to-date)
- [Debug logs](#debug-logs)
- [Third party information](#third-party-information)
- [Contributing to this repo](#contributing-to-this-repo)
## Usage
@@ -30,7 +38,7 @@ This action sets up a Julia environment for use in actions by downloading a spec
# Warning: It is strongly recommended to wrap this value in quotes.
# Otherwise, the YAML parser used by GitHub Actions parses certain
# versions as numbers which causes the wrong version to be selected.
# For example, `1.0` may be parsed as `1`.
# For example, `1.10` may be parsed as `1.1`.
#
# Default: '1'
version: ''
@@ -63,6 +71,11 @@ This action sets up a Julia environment for use in actions by downloading a spec
#
# Default: false
show-versioninfo: ''
# Set the path to the project directory or file to use when resolving some versions (e.g. `min`).
#
# Defaults to using JULIA_PROJECT if defined, otherwise '.'
project: ''
```
### Outputs
@@ -109,8 +122,11 @@ You can either specify specific Julia versions or version ranges. If you specify
- `'~1.3.0-rc1'` is a **tilde** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 1.4.0`.
- `'^1.3.0-0'` is a **caret** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 2.0.0`.
- `'~1.3.0-0'` is a **tilde** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
- `'lts'` will install the latest LTS build.
- `'pre'` will install the latest prerelease build (RCs, betas, and alphas).
- `'nightly'` will install the latest nightly build.
- `'1.7-nightly'` will install the latest nightly build for the upcoming 1.7 release. This version will only be available during certain phases of the Julia release cycle.
- `'min'` will install the earliest supported version of Julia compatible with the project. Especially useful in monorepos.
Internally the action uses node's semver package to resolve version ranges. Its [documentation](https://github.com/npm/node-semver#advanced-range-syntax) contains more details on the version range syntax. You can test what version will be selected for a given input in this JavaScript [REPL](https://repl.it/@SaschaMann/setup-julia-version-logic).
@@ -283,3 +299,7 @@ Note that when debug logs are enabled, a request will be sent to `https://httpbi
## Third party information
Parts of this software have been derived from other open source software.
See [THIRD_PARTY_NOTICE.md](THIRD_PARTY_NOTICE.md) for details.
## Contributing to this repo
Please see the README in the [`devdocs/`](devdocs/) folder.

View File

View File

File diff suppressed because it is too large Load Diff

View File

@@ -4,30 +4,30 @@
import * as path from 'path'
import * as io from '@actions/io'
import nock = require('nock')
import * as semver from 'semver'
import nock = require('nock')
const testVersions = [
'0.1.2', '0.2.0', '0.2.1', '0.3.0',
'0.3.1', '0.3.10', '0.3.11', '0.3.12',
'0.3.2', '0.3.3', '0.3.4', '0.3.5',
'0.3.6', '0.3.7', '0.3.8', '0.3.9',
'0.4.0', '0.4.0-rc1', '0.4.0-rc2', '0.4.0-rc3',
'0.4.0-rc4', '0.4.1', '0.4.2', '0.4.3',
'0.4.4', '0.4.5', '0.4.6', '0.4.7',
'0.5.0', '0.5.0-rc0', '0.5.0-rc1', '0.5.0-rc2',
'0.5.0-rc3', '0.5.0-rc4', '0.5.1', '0.5.2',
'0.6.0', '0.6.0-pre.alpha', '0.6.0-pre.beta', '0.6.0-rc1',
'0.6.0-rc2', '0.6.0-rc3', '0.6.1', '0.6.2',
'0.6.3', '0.6.4', '0.7.0', '0.7.0-alpha',
'0.7.0-beta', '0.7.0-beta2', '0.7.0-rc1', '0.7.0-rc2',
'0.7.0-rc3', '1.0.0', '1.0.0-rc1', '1.0.1',
'1.0.2', '1.0.3', '1.0.4', '1.0.5',
'1.1.0', '1.1.0-rc1', '1.1.0-rc2', '1.1.1',
'1.2.0', '1.2.0-rc1', '1.2.0-rc2', '1.2.0-rc3',
'1.3.0-alpha', '1.3.0-rc1', '1.3.0-rc2', '1.3.0-rc3',
'1.3.0-rc4'
'0.1.2',
'0.2.0', '0.2.1',
'0.3.0', '0.3.1', '0.3.10', '0.3.11', '0.3.12', '0.3.2', '0.3.3', '0.3.4', '0.3.5', '0.3.6', '0.3.7', '0.3.8', '0.3.9',
'0.4.0', '0.4.0-rc1', '0.4.0-rc2', '0.4.0-rc3', '0.4.0-rc4', '0.4.1', '0.4.2', '0.4.3', '0.4.4', '0.4.5', '0.4.6', '0.4.7',
'0.5.0', '0.5.0-rc0', '0.5.0-rc1', '0.5.0-rc2', '0.5.0-rc3', '0.5.0-rc4', '0.5.1', '0.5.2',
'0.6.0', '0.6.0-pre.alpha', '0.6.0-pre.beta', '0.6.0-rc1', '0.6.0-rc2', '0.6.0-rc3', '0.6.1', '0.6.2', '0.6.3', '0.6.4',
'0.7.0', '0.7.0-alpha', '0.7.0-beta', '0.7.0-beta2', '0.7.0-rc1', '0.7.0-rc2', '0.7.0-rc3',
'1.0.0', '1.0.0-rc1', '1.0.1', '1.0.2', '1.0.3', '1.0.4', '1.0.5',
'1.1.0', '1.1.0-rc1', '1.1.0-rc2', '1.1.1',
'1.2.0', '1.2.0-rc1', '1.2.0-rc2', '1.2.0-rc3',
'1.3.0', '1.3.0-alpha', '1.3.0-rc1', '1.3.0-rc2', '1.3.0-rc3', '1.3.0-rc4', '1.3.0-rc5', '1.3.1',
'1.4.0', '1.4.0-rc1', '1.4.0-rc2', '1.4.1', '1.4.2',
'1.5.0', '1.5.0-beta1', '1.5.0-rc1', '1.5.0-rc2', '1.5.1', '1.5.2', '1.5.3', '1.5.4',
'1.6.0', '1.6.0-beta1', '1.6.0-rc1', '1.6.0-rc2', '1.6.0-rc3', '1.6.1', '1.6.2', '1.6.3', '1.6.4', '1.6.5', '1.6.6', '1.6.7',
'1.7.0', '1.7.0-beta1', '1.7.0-beta2', '1.7.0-beta3', '1.7.0-beta4', '1.7.0-rc1', '1.7.0-rc2', '1.7.0-rc3', '1.7.1', '1.7.2', '1.7.3',
'1.8.0', '1.8.0-beta1', '1.8.0-beta2', '1.8.0-beta3', '1.8.0-rc1', '1.8.0-rc2', '1.8.0-rc3', '1.8.0-rc4', '1.8.1', '1.8.2', '1.8.3', '1.8.4', '1.8.5',
'1.9.0', '1.9.0-alpha1', '1.9.0-beta1', '1.9.0-beta2', '1.9.0-beta3', '1.9.0-beta4', '1.9.0-rc1', '1.9.0-rc2', '1.9.0-rc3', '1.9.1', '1.9.2', '1.9.3', '1.9.4',
'1.10.0', '1.10.0-alpha1', '1.10.0-beta1', '1.10.0-beta2', '1.10.0-beta3', '1.10.0-rc1', '1.10.0-rc2', '1.10.0-rc3', '1.10.1', '1.10.2', '1.10.3', '1.10.4', '1.10.5',
'1.11.0', '1.11.0-alpha1', '1.11.0-alpha2', '1.11.0-beta1', '1.11.0-beta2', '1.11.0-rc1', '1.11.0-rc2', '1.11.0-rc3', '1.11.0-rc4',
]
const toolDir = path.join(__dirname, 'runner', 'tools')
@@ -38,6 +38,135 @@ process.env['RUNNER_TOOL_CACHE'] = toolDir
process.env['RUNNER_TEMP'] = tempDir
import * as installer from '../src/installer'
import exp from 'constants'
describe("getProjectFilePath tests", () => {
let orgJuliaProject
let orgWorkingDir
beforeEach(() => {
orgJuliaProject = process.env["JULIA_PROJECT"]
orgWorkingDir = process.cwd()
delete process.env["JULIA_PROJECT"]
})
afterEach(() => {
process.env["JULIA_PROJECT"] = orgJuliaProject
process.chdir(orgWorkingDir)
})
it("Can determine project file is missing", () => {
expect(() => installer.getProjectFilePath("DNE.toml")).toThrow("Unable to locate project file")
expect(() => installer.getProjectFilePath(fixtureDir)).toThrow("Unable to locate project file")
expect(() => installer.getProjectFilePath()).toThrow("Unable to locate project file")
})
it('Can determine project file from a directory', () => {
expect(installer.getProjectFilePath(path.join(fixtureDir, "PkgA"))).toEqual(path.join(fixtureDir, "PkgA", "Project.toml"))
expect(installer.getProjectFilePath(path.join(fixtureDir, "PkgB"))).toEqual(path.join(fixtureDir, "PkgB", "JuliaProject.toml"))
})
it("Prefers using JuliaProject.toml over Project.toml", () => {
expect(installer.getProjectFilePath(path.join(fixtureDir, "PkgC"))).toEqual(path.join(fixtureDir, "PkgC", "JuliaProject.toml"))
})
it("Can determine project from JULIA_PROJECT", () => {
process.env["JULIA_PROJECT"] = path.join(fixtureDir, "PkgA")
expect(installer.getProjectFilePath()).toEqual(path.join(fixtureDir, "PkgA", "Project.toml"))
})
it("Can determine project from the current working directory", () => {
process.chdir(path.join(fixtureDir, "PkgA"));
expect(installer.getProjectFilePath()).toEqual("Project.toml")
})
it("Ignores JULIA_PROJECT when argument is used", () => {
process.env["JULIA_PROJECT"] = path.join(fixtureDir, "PkgB")
expect(installer.getProjectFilePath(path.join(fixtureDir, "PkgA"))).toEqual(path.join(fixtureDir, "PkgA", "Project.toml"))
})
})
describe("validJuliaCompatRange tests", () => {
it('Handles default caret specifier', () => {
expect(installer.validJuliaCompatRange("1")).toEqual(semver.validRange("^1"))
expect(installer.validJuliaCompatRange("1.2")).toEqual(semver.validRange("^1.2"))
expect(installer.validJuliaCompatRange("1.2.3")).toEqual(semver.validRange("^1.2.3"))
// TODO: Pkg.jl currently does not support pre-release entries in compat so ideally this would fail
expect(installer.validJuliaCompatRange("1.2.3-rc1")).toEqual(semver.validRange("^1.2.3-rc1"))
})
it('Handle surrounding whitespace', () => {
expect(installer.validJuliaCompatRange(" 1")).toEqual(semver.validRange("^1"))
expect(installer.validJuliaCompatRange("1 ")).toEqual(semver.validRange("^1"))
expect(installer.validJuliaCompatRange(" 1 ")).toEqual(semver.validRange("^1"))
})
it('Handles version ranges with specifiers', () => {
expect(installer.validJuliaCompatRange("^1.2.3")).toEqual(semver.validRange("^1.2.3"))
expect(installer.validJuliaCompatRange("~1.2.3")).toEqual(semver.validRange("~1.2.3"))
expect(installer.validJuliaCompatRange("=1.2.3")).toEqual(semver.validRange("=1.2.3"))
expect(installer.validJuliaCompatRange(">=1.2.3")).toEqual(">=1.2.3")
expect(installer.validJuliaCompatRange("≥1.2.3")).toEqual(">=1.2.3")
expect(installer.validJuliaCompatRange("<1.2.3")).toEqual("<1.2.3")
})
it('Handles whitespace after specifiers', () => {
expect(installer.validJuliaCompatRange("^ 1.2.3")).toBeNull()
expect(installer.validJuliaCompatRange("~ 1.2.3")).toBeNull()
expect(installer.validJuliaCompatRange("= 1.2.3")).toBeNull()
expect(installer.validJuliaCompatRange(">= 1.2.3")).toEqual(">=1.2.3")
expect(installer.validJuliaCompatRange("≥ 1.2.3")).toEqual(">=1.2.3")
expect(installer.validJuliaCompatRange("< 1.2.3")).toEqual("<1.2.3")
})
it('Handles hypen ranges', () => {
expect(installer.validJuliaCompatRange("1.2.3 - 4.5.6")).toEqual(semver.validRange("1.2.3 - 4.5.6"))
expect(installer.validJuliaCompatRange("1.2.3-rc1 - 4.5.6")).toEqual(semver.validRange("1.2.3-rc1 - 4.5.6"))
expect(installer.validJuliaCompatRange("1.2.3-rc1-4.5.6")).toEqual(semver.validRange("^1.2.3-rc1-4.5.6")) // A version number and not a hypen range
expect(installer.validJuliaCompatRange("1.2.3-rc1 -4.5.6")).toBeNull()
expect(installer.validJuliaCompatRange("1.2.3-rc1- 4.5.6")).toBeNull() // Whitespace separate version ranges
})
it("Returns null AND operator on version ranges", () => {
expect(installer.validJuliaCompatRange("")).toBeNull()
expect(installer.validJuliaCompatRange("1 2 3")).toBeNull()
expect(installer.validJuliaCompatRange("1- 2")).toBeNull()
expect(installer.validJuliaCompatRange("<1 <1")).toBeNull()
expect(installer.validJuliaCompatRange("< 1 < 1")).toBeNull()
expect(installer.validJuliaCompatRange("< 1 < 1")).toBeNull()
})
it('Returns null with invalid specifiers', () => {
expect(installer.validJuliaCompatRange("<=1.2.3")).toBeNull()
expect(installer.validJuliaCompatRange("≤1.2.3")).toBeNull()
expect(installer.validJuliaCompatRange("*")).toBeNull()
})
it("Handles OR operator on version ranges", () => {
expect(installer.validJuliaCompatRange("1, 2, 3")).toEqual(semver.validRange("^1 || ^2 || ^3"))
expect(installer.validJuliaCompatRange("1, 2 - 3, ≥ 4")).toEqual(semver.validRange("^1 || >=2 <=3 || >=4"))
expect(installer.validJuliaCompatRange(",")).toBeNull()
})
})
describe("readJuliaCompatRange tests", () => {
it('Can determine Julia compat entries', () => {
const toml = '[compat]\njulia = "1, ^1.1, ~1.2, >=1.3, 1.4 - 1.5"'
expect(installer.readJuliaCompatRange(toml)).toEqual(semver.validRange("^1 || ^1.1 || ~1.2 || >=1.3 || 1.4 - 1.5"))
})
it('Throws with invalid version ranges', () => {
expect(() => installer.readJuliaCompatRange('[compat]\njulia = ""')).toThrow("Invalid version range")
expect(() => installer.readJuliaCompatRange('[compat]\njulia = "1 2 3"')).toThrow("Invalid version range")
})
it('Handle missing compat entries', () => {
expect(installer.readJuliaCompatRange("")).toEqual("*")
expect(installer.readJuliaCompatRange("[compat]")).toEqual("*")
})
})
describe('version matching tests', () => {
describe('specific versions', () => {
@@ -55,22 +184,33 @@ describe('version matching tests', () => {
expect(installer.getJuliaVersion([], 'nightly')).toEqual('nightly')
expect(installer.getJuliaVersion(testVersions, 'nightly')).toEqual('nightly')
})
it('LTS', () => {
// Update test when LTS is updated
expect(installer.getJuliaVersion(testVersions, 'lts')).toEqual(installer.getJuliaVersion(testVersions, '1.10'))
expect(installer.getJuliaVersion(testVersions, 'lts')).toEqual('1.10.5')
})
it('pre', () => {
expect(installer.getJuliaVersion(testVersions, 'pre')).toEqual('1.11.0')
})
})
describe('version ranges', () => {
it('Chooses the highest available version that matches the input', () => {
expect(installer.getJuliaVersion(testVersions, '1')).toEqual('1.2.0')
expect(installer.getJuliaVersion(testVersions, '1')).toEqual('1.11.0')
expect(installer.getJuliaVersion(testVersions, '1.0')).toEqual('1.0.5')
expect(installer.getJuliaVersion(testVersions, '^1.3.0-rc1')).toEqual('1.3.0-rc4')
expect(installer.getJuliaVersion(testVersions, '^1.2.0-rc1')).toEqual('1.2.0')
expect(installer.getJuliaVersion(testVersions, '^1.3.0-rc1')).toEqual('1.11.0')
expect(installer.getJuliaVersion(testVersions, '^1.2.0-rc1')).toEqual('1.11.0')
expect(installer.getJuliaVersion(testVersions, '^1.10.0-rc1')).toEqual('1.11.0')
})
})
describe('include-prereleases', () => {
it('Chooses the highest available version that matches the input including prereleases', () => {
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', true)).toEqual('1.3.0-rc4')
expect(installer.getJuliaVersion(testVersions, '1', true)).toEqual('1.3.0-rc4')
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', false)).toEqual('1.2.0')
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', true)).toEqual('1.11.0')
expect(installer.getJuliaVersion(testVersions, '1', true)).toEqual('1.11.0')
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', false)).toEqual('1.11.0')
})
})
@@ -84,6 +224,34 @@ describe('version matching tests', () => {
})
})
})
describe('julia compat versions', () => {
it('Understands "min"', () => {
let versions = ["1.6.7", "1.7.1-rc1", "1.7.1-rc2", "1.7.1", "1.7.2", "1.8.0"]
expect(installer.getJuliaVersion(versions, "min", false, "^1.7")).toEqual("1.7.1")
expect(installer.getJuliaVersion(versions, "min", true, "^1.7")).toEqual("1.7.1-rc1")
versions = ["1.6.7", "1.7.3-rc1", "1.7.3-rc2", "1.8.0"]
expect(installer.getJuliaVersion(versions, "min", false, "^1.7")).toEqual("1.8.0")
expect(installer.getJuliaVersion(versions, "min", true, "^1.7")).toEqual("1.7.3-rc1")
expect(installer.getJuliaVersion(versions, "min", false, "~1.7 || ~1.8 || ~1.9")).toEqual("1.8.0")
expect(installer.getJuliaVersion(versions, "min", true, "~1.7 || ~1.8 || ~1.9")).toEqual("1.7.3-rc1")
expect(installer.getJuliaVersion(versions, "min", false, "~1.8 || ~1.7 || ~1.9")).toEqual("1.8.0")
expect(installer.getJuliaVersion(versions, "min", true, "~1.8 || ~1.7 || ~1.9")).toEqual("1.7.3-rc1")
expect(installer.getJuliaVersion(versions, "min", false, "1.7 - 1.9")).toEqual("1.8.0")
expect(installer.getJuliaVersion(versions, "min", true, "1.7 - 1.9")).toEqual("1.7.3-rc1")
expect(installer.getJuliaVersion(versions, "min", true, "< 1.9.0")).toEqual("1.6.7")
expect(installer.getJuliaVersion(versions, "min", true, ">= 1.6.0")).toEqual("1.6.7")
// NPM's semver package treats "1.7" as "~1.7" instead of "^1.7" like Julia
expect(() => installer.getJuliaVersion(versions, "min", false, "1.7")).toThrow("Could not find a Julia version that matches")
expect(() => installer.getJuliaVersion(versions, "min", true, "")).toThrow("Julia project file does not specify a compat for Julia")
})
})
})
describe('installer tests', () => {

View File

@@ -1,9 +1,9 @@
name: 'Setup Julia environment'
description: 'Setup a Julia environment and add it to the PATH'
author: 'Sascha Mann'
inputs:
inputs:
version:
description: 'The Julia version to download (if necessary) and use. Example: 1.0.4'
description: 'The Julia version to download (if necessary) and use. Use a string input to avoid unwanted decimal conversion e.g. 1.10 without quotes will be interpreted as 1.1. Examples: "1", "1.10", "lts", "pre"'
default: '1'
include-all-prereleases:
description: 'Include prereleases when matching the Julia version to available versions.'
@@ -12,11 +12,15 @@ inputs:
arch:
description: 'Architecture of the Julia binaries. Defaults to the architecture of the runner executing the job.'
required: false
default: '${{ runner.arch }}'
default: 'default'
show-versioninfo:
description: 'Display InteractiveUtils.versioninfo() after installing'
required: false
default: 'false'
project:
description: 'The path to the project directory or file to use when resolving some versions (e.g. min)'
required: false
default: '' # Special value which fallsback to using JULIA_PROJECT if defined, otherwise "."
outputs:
julia-version:
description: 'The installed Julia version. May vary from the version input if a version range was given as input.'

1
bin

Submodule bin deleted from 31b4b500a3

View File

@@ -0,0 +1,16 @@
const cmd = `git --no-pager diff --exit-code --stat`
const proc = run(pipeline(cmd; stdin, stdout, stderr); wait = false)
wait(proc)
@info "" success(proc) proc.exitcode
if !success(proc)
recommended_cmd = "make everything-from-scratch"
msg = "##[error] found changed files after build. " *
"Please run `$(recommended_cmd)` and " *
"then check in all changes."
println(stderr, msg)
exit(1)
end

7
devdocs/README.md Normal file
View File

@@ -0,0 +1,7 @@
# Devdocs for the `setup-julia` repo
If you want to make a pull request to this repo, please read the following:
1. [Local development](local_setup.md)
If you have commit access to this repo, you may be interested in the following:
1. [Making a new release of this action](making_a_new_release.md)

49
devdocs/local_setup.md Normal file
View File

@@ -0,0 +1,49 @@
# Local development
## 1. Clone the repo
```bash
git clone git@github.com:julia-actions/setup-julia.git
cd setup-julia
```
## 2. Install NodeJS
### Unix, using `asdf` (recommended, but not required)
First, make sure that you have installed [`asdf`](https://asdf-vm.com/) on your local machine.
Then, `cd` to your clone of the repo and run the following commands:
```bash
asdf plugin add nodejs
asdf install
```
This will use `asdf` to install the correct version of NodeJS.
### Unix, but not using `asdf`
Instead of using `asdf`, you can instead choose to install NodeJS manually.
First, check the `.tool-versions` file in this repo, and see what version of NodeJS you need. Then, install that same version of NodejS on your local machine.
### Windows
`asdf` does not (currently) support Windows. So on Windows, you have to install NodeJS manually.
First, check the `.tool-versions` file in this repo, and see what version of NodeJS you need. Then, install that same version of NodejS on your local machine.
## 3. Working locally
First, `cd` to your clone of the repo. Now you can run the following commands:
```bash
npm ci
npm run build
npm run pack
```
When you are ready, you can commit your changes and push them to your PR.

View File

@@ -0,0 +1,56 @@
# Making a new release of this action (requires commit access)
In this guide, as an example, `v2.2.0` refers to the version number of the new release that you want to make.
## Part 1: Use the Git CLI to create and push the Git tags
Step 1: Create a new lightweight tag of the form `vMAJOR.MINOR.PATCH`.
```bash
git clone git@github.com:julia-actions/setup-julia.git
cd setup-julia
git fetch --all --tags
git checkout main
git --no-pager log -1
# Take note of the commit hash here.
# Now, create a new lightweight tag of the form `vMAJOR.MINOR.PATCH`.
#
# Replace `commit_hash` with the commit hash that you obtained from the
# `git log -1` step.
#
# Replace `v2.2.0` with the actual version number that you want to use.
git tag v2.2.0 commit_hash
```
Step 2: Once you've created the new release, you need to update the `v2` tag to point to the new release. For example, suppose that the previous release was `v2.1.0`, and suppose that you just created the new release `v2.2.0`. You need to update the `v2` tag so that it points to `v2.2.0`. Here are the commands:
```bash
# Create/update the new v2 tag locally, where the new v2 tag will point to the
# release that you created in the previous step.
#
# Make sure to change `v2.2.0` to the actual value for the tag that you just
# created in the previous step.
#
# The `-f` flag forcibly overwrites the old
# `v2` tag (if it exists).
git tag -f v2 v2.2.0
```
Step 3: Now you need to push the tags:
```bash
# Regular-push the new `v2.2.0` tag:
git push origin tag v2.2.0
# Force-push the new v2 tag:
git push origin tag v2 --force
```
## Part 2: Create the GitHub Release
Go to the [Releases](https://github.com/julia-actions/setup-julia/releases) section of this repo and create a new release (using the GitHub web interface).
For the "choose a tag" drop-down field, select the `v2.2.0` tag that you created and pushed in Part 1 of this guide.

View File

@@ -1,4 +1,4 @@
# Contributors
# Misc notes for contributors
### Checkin
@@ -19,4 +19,4 @@ git commit -m "Informative commit message" # Commit. This will run Husky
```
During the commit step, Husky will take care of formatting all files with [Prettier](https://github.com/prettier/prettier) as well as pruning out devDependencies using `npm prune --production`.
It will also make sure these changes are appropriately included in your commit (no further work is needed)
It will also make sure these changes are appropriately included in your commit (no further work is needed)

37790
dist/index.js vendored Normal file

File diff suppressed because one or more lines are too long

150
lib/installer.js generated
View File

@@ -32,7 +32,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.showVersionInfo = exports.installJulia = exports.getDownloadURL = exports.getFileInfo = exports.getJuliaVersion = exports.getJuliaVersions = exports.getJuliaVersionInfo = void 0;
exports.getJuliaVersionInfo = getJuliaVersionInfo;
exports.getJuliaVersions = getJuliaVersions;
exports.getProjectFilePath = getProjectFilePath;
exports.validJuliaCompatRange = validJuliaCompatRange;
exports.readJuliaCompatRange = readJuliaCompatRange;
exports.getJuliaVersion = getJuliaVersion;
exports.getFileInfo = getFileInfo;
exports.getDownloadURL = getDownloadURL;
exports.installJulia = installJulia;
exports.showVersionInfo = showVersionInfo;
const core = __importStar(require("@actions/core"));
const exec = __importStar(require("@actions/exec"));
const tc = __importStar(require("@actions/tool-cache"));
@@ -42,6 +51,9 @@ const os = __importStar(require("os"));
const path = __importStar(require("path"));
const retry = require("async-retry");
const semver = __importStar(require("semver"));
const toml = __importStar(require("toml"));
const LTS_VERSION = '1.10';
const MAJOR_VERSION = '1'; // Could be deduced from versions.json
// Translations between actions input and Julia arch names
const osMap = {
'win32': 'winnt',
@@ -92,7 +104,6 @@ function getJuliaVersionInfo() {
return JSON.parse(fs.readFileSync(versionsFile).toString());
});
}
exports.getJuliaVersionInfo = getJuliaVersionInfo;
/**
* @returns An array of all Julia versions available for download
*/
@@ -105,22 +116,112 @@ function getJuliaVersions(versionInfo) {
return versions;
});
}
exports.getJuliaVersions = getJuliaVersions;
function getJuliaVersion(availableReleases, versionInput, includePrerelease = false) {
/**
* @returns The path to the Julia project file
*/
function getProjectFilePath(projectInput = "") {
let projectFilePath = "";
// Default value for projectInput
if (!projectInput) {
projectInput = process.env.JULIA_PROJECT || ".";
}
if (fs.existsSync(projectInput) && fs.lstatSync(projectInput).isFile()) {
projectFilePath = projectInput;
}
else {
for (let projectFilename of ["JuliaProject.toml", "Project.toml"]) {
let p = path.join(projectInput, projectFilename);
if (fs.existsSync(p) && fs.lstatSync(p).isFile()) {
projectFilePath = p;
break;
}
}
}
if (!projectFilePath) {
throw new Error(`Unable to locate project file with project input: ${projectInput}`);
}
return projectFilePath;
}
/**
* @returns A valid NPM semver range from a Julia compat range or null if it's not valid
*/
function validJuliaCompatRange(compatRange) {
let ranges = [];
for (let range of compatRange.split(",")) {
range = range.trim();
// An empty range isn't supported by Julia
if (!range) {
return null;
}
// NPM's semver doesn't understand unicode characters such as `≥` so we'll convert to alternatives
range = range.replace("≥", ">=").replace("≤", "<=");
// Cleanup whitespace. Julia only allows whitespace between the specifier and version with certain specifiers
range = range.replace(/\s+/g, " ").replace(/(?<=(>|>=|≥|<)) (?=\d)/g, "");
if (!semver.validRange(range) || range.split(/(?<! -) (?!- )/).length > 1 || range.startsWith("<=") || range === "*") {
return null;
}
else if (range.search(/^\d/) === 0 && !range.includes(" ")) {
// Compat version is just a basic version number (e.g. 1.2.3). Since Julia's Pkg.jl's uses caret
// as the default specifier (e.g. `1.2.3 == ^1.2.3`) and NPM's semver uses tilde as the default
// specifier (e.g. `1.2.3 == 1.2.x == ~1.2.3`) we will introduce the caret specifier to ensure the
// orignal intent is respected.
// https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format
// https://github.com/npm/node-semver#x-ranges-12x-1x-12-
range = "^" + range;
}
ranges.push(range);
}
return semver.validRange(ranges.join(" || "));
}
/**
* @returns An array of version ranges compatible with the Julia project
*/
function readJuliaCompatRange(projectFileContent) {
var _a;
let compatRange;
let meta = toml.parse(projectFileContent);
if (((_a = meta.compat) === null || _a === void 0 ? void 0 : _a.julia) !== undefined) {
compatRange = validJuliaCompatRange(meta.compat.julia);
}
else {
compatRange = "*";
}
if (!compatRange) {
throw new Error(`Invalid version range found in Julia compat: ${compatRange}`);
}
return compatRange;
}
function getJuliaVersion(availableReleases, versionInput, includePrerelease = false, juliaCompatRange = "") {
// Note: `juliaCompatRange` is ignored unless `versionInput` is `min`
let version;
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
// versionInput is a valid version or a nightly version, use it directly
return versionInput;
version = versionInput;
}
// Use the highest available version that matches versionInput
let version = semver.maxSatisfying(availableReleases, versionInput, { includePrerelease });
if (version == null) {
else if (versionInput == "min") {
// Resolve "min" to the minimum supported Julia version compatible with the project file
if (!juliaCompatRange) {
throw new Error('Unable to use version "min" when the Julia project file does not specify a compat for Julia');
}
version = semver.minSatisfying(availableReleases, juliaCompatRange, { includePrerelease });
}
else if (versionInput == "lts") {
version = semver.maxSatisfying(availableReleases, LTS_VERSION, { includePrerelease: false });
}
else if (versionInput == "pre") {
version = semver.maxSatisfying(availableReleases, MAJOR_VERSION, { includePrerelease: true });
}
else {
// Use the highest available version that matches versionInput
version = semver.maxSatisfying(availableReleases, versionInput, { includePrerelease });
}
if (!version) {
throw new Error(`Could not find a Julia version that matches ${versionInput}`);
}
// GitHub tags start with v, remove it
version = version.replace(/^v/, '');
return version;
}
exports.getJuliaVersion = getJuliaVersion;
function getDesiredFileExts() {
let fileExt1;
let hasFileExt2;
@@ -206,6 +307,7 @@ function getFileInfo(versionInfo, version, arch) {
return null;
}
if (!versionInfo[version]) {
core.error(`Encountered error: ${err}`);
throw err;
}
for (let file of versionInfo[version].files) {
@@ -224,10 +326,35 @@ function getFileInfo(versionInfo, version, arch) {
}
}
}
// The following block is just to provide improved log messages in the CI logs.
// We specifically want to improve the case where someone is trying to install
// Julia 1.6 or 1.7 on Apple Silicon (aarch64) macOS.
{
const one_fileext_is_targz = (fileExt1 == "tar.gz") || (fileExt2 == "tar.gz");
const one_fileext_is_dmg = (fileExt1 == "dmg") || (fileExt2 == "dmg");
const one_fileext_is_targz_and_other_is_dmg = one_fileext_is_targz && one_fileext_is_dmg;
// We say that "this Julia version does NOT have native binaries for Apple Silicon"
// if and only if "this Julia version is < 1.8.0"
const this_julia_version_does_NOT_have_native_binaries_for_apple_silicon = semver.lt(version, '1.8.0');
const this_is_macos = osPlat == 'darwin';
if (this_is_macos && one_fileext_is_targz_and_other_is_dmg && this_julia_version_does_NOT_have_native_binaries_for_apple_silicon) {
const msg = `It looks like you are trying to install Julia 1.6 or 1.7 on ` +
`the "macos-latest" runners.\n` +
`"macos-latest" now resolves to "macos-14", which run on Apple ` +
`Silicon (aarch64) macOS machines.\n` +
`Unfortunately, Julia 1.6 and 1.7 do not have native binaries ` +
`available for Apple Silicon macOS.\n` +
`Therefore, it is not possible to install Julia with the current ` +
`constraints.\n` +
`For instructions on how to fix this error, please see the following Discourse post: ` +
`https://discourse.julialang.org/t/how-to-fix-github-actions-ci-failures-with-julia-1-6-or-1-7-on-macos-latest-and-macos-14/117019`;
core.error(msg);
}
}
}
core.error(`Encountered error: ${err}`);
throw err;
}
exports.getFileInfo = getFileInfo;
function getDownloadURL(fileInfo, version, arch) {
const baseURL = `https://julialangnightlies-s3.julialang.org/bin/${osMap[osPlat]}/${arch}`;
// release branch nightlies, e.g. 1.6-nightlies should return .../bin/linux/x64/1.6/julia-latest-linux64.tar.gz
@@ -245,7 +372,6 @@ function getDownloadURL(fileInfo, version, arch) {
}
return fileInfo.url;
}
exports.getDownloadURL = getDownloadURL;
function installJulia(dest, versionInfo, version, arch) {
return __awaiter(this, void 0, void 0, function* () {
// Download Julia
@@ -313,7 +439,6 @@ function installJulia(dest, versionInfo, version, arch) {
}
});
}
exports.installJulia = installJulia;
/**
* Test if Julia has been installed and print the version.
*
@@ -350,4 +475,3 @@ function showVersionInfo(showVersionInfoInput, version) {
}
});
}
exports.showVersionInfo = showVersionInfo;

49
lib/setup-julia.js generated
View File

@@ -36,15 +36,18 @@ const core = __importStar(require("@actions/core"));
const tc = __importStar(require("@actions/tool-cache"));
const fs = __importStar(require("fs"));
const https = __importStar(require("https"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const installer = __importStar(require("./installer"));
// Note: before we index into this dict, we always first do `.toLowerCase()` on
// the key.
//
// Therefore, this dict does not need to account for differences in case.
const archSynonyms = {
'x86': 'x86',
'X86': 'x86',
'x64': 'x64',
'X64': 'x64',
'x86_64': 'x64',
'aarch64': 'aarch64',
'ARM64': 'aarch64',
'arm64': 'aarch64'
};
function run() {
@@ -65,25 +68,49 @@ function run() {
core.debug(`ERROR: Could not retrieve runner IP: ${err}`);
});
}
// Inputs
const versionInput = core.getInput('version');
const includePrereleases = core.getInput('include-all-prereleases') == 'true';
const originalArchInput = core.getInput('arch');
// Inputs.
// Note that we intentionally strip leading and lagging whitespace by using `.trim()`
const versionInput = core.getInput('version').trim();
const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true';
const originalArchInput = core.getInput('arch').trim();
const projectInput = core.getInput('project').trim(); // Julia project file
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
// while the strategy matrix only contains a key `${{ matrix.version }}`.
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
// is worse than failing the build.
if (!versionInput) {
if (!versionInput) { // if `versionInput` is an empty string
throw new Error('Version input must not be null');
}
if (!originalArchInput) {
if (versionInput == '1.6') {
core.notice('[setup-julia] If you are testing 1.6 as a Long Term Support (lts) version, consider using the new "lts" version specifier instead of "1.6" explicitly, which will automatically resolve the current lts.');
}
if (!originalArchInput) { // if `originalArchInput` is an empty string
throw new Error(`Arch input must not be null`);
}
const arch = archSynonyms[originalArchInput];
let processedArchInput;
if (originalArchInput == "default") {
// If the user sets the `arch` input to `default`, then we use the
// architecture of the machine that we are running on.
processedArchInput = os.arch();
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`);
}
else {
processedArchInput = originalArchInput;
}
// Note: we convert the key `processedArchInput` to lower case
// before we index into the `archSynonyms` dict.
const arch = archSynonyms[processedArchInput.toLowerCase()];
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`);
// Determine the Julia compat ranges as specified by the Project.toml only for special versions that require them.
let juliaCompatRange = "";
if (versionInput === "min") {
const projectFilePath = installer.getProjectFilePath(projectInput);
juliaCompatRange = installer.readJuliaCompatRange(fs.readFileSync(projectFilePath).toString());
}
const versionInfo = yield installer.getJuliaVersionInfo();
const availableReleases = yield installer.getJuliaVersions(versionInfo);
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases);
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases, juliaCompatRange);
core.debug(`selected Julia version: ${arch}/${version}`);
core.setOutput('julia-version', version);
// Search in cache

5107
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,5 @@
{
"name": "setup-julia",
"version": "2.0.0",
"private": true,
"description": "setup Julia action",
"main": "lib/setup-julia.js",
@@ -21,25 +20,26 @@
"author": "Sascha Mann <git@mail.saschamann.eu>",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/core": "^1.11.1",
"@actions/exec": "^1.1.1",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.1",
"async-retry": "^1.3.3",
"semver": "^7.6.0"
"semver": "^7.6.3",
"toml": "^3.0.0"
},
"devDependencies": {
"@types/async-retry": "^1.4.8",
"@types/jest": "^29.5.12",
"@types/node": "^20.12.8",
"@types/async-retry": "^1.4.9",
"@types/jest": "^29.5.13",
"@types/node": "^22.7.5",
"@types/retry": "^0.12.5",
"@types/semver": "^7.5.8",
"@vercel/ncc": "^0.38.1",
"@vercel/ncc": "^0.38.2",
"jest": "^29.7.0",
"jest-circus": "^29.7.0",
"nock": "^13.5.4",
"prettier": "^3.2.5",
"ts-jest": "^29.1.2",
"typescript": "^5.4.5"
"prettier": "^3.3.3",
"ts-jest": "^29.2.5",
"typescript": "^5.6.3"
}
}

View File

@@ -9,6 +9,10 @@ import * as path from 'path'
import retry = require('async-retry')
import * as semver from 'semver'
import * as toml from 'toml'
const LTS_VERSION = '1.10'
const MAJOR_VERSION = '1' // Could be deduced from versions.json
// Translations between actions input and Julia arch names
const osMap = {
@@ -76,15 +80,116 @@ export async function getJuliaVersions(versionInfo): Promise<string[]> {
return versions
}
export function getJuliaVersion(availableReleases: string[], versionInput: string, includePrerelease: boolean = false): string {
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
// versionInput is a valid version or a nightly version, use it directly
return versionInput
/**
* @returns The path to the Julia project file
*/
export function getProjectFilePath(projectInput: string = ""): string {
let projectFilePath: string = ""
// Default value for projectInput
if (!projectInput) {
projectInput = process.env.JULIA_PROJECT || "."
}
// Use the highest available version that matches versionInput
let version = semver.maxSatisfying(availableReleases, versionInput, {includePrerelease})
if (version == null) {
if (fs.existsSync(projectInput) && fs.lstatSync(projectInput).isFile()) {
projectFilePath = projectInput
} else {
for (let projectFilename of ["JuliaProject.toml", "Project.toml"]) {
let p = path.join(projectInput, projectFilename)
if (fs.existsSync(p) && fs.lstatSync(p).isFile()) {
projectFilePath = p
break
}
}
}
if (!projectFilePath) {
throw new Error(`Unable to locate project file with project input: ${projectInput}`)
}
return projectFilePath
}
/**
* @returns A valid NPM semver range from a Julia compat range or null if it's not valid
*/
export function validJuliaCompatRange(compatRange: string): string | null {
let ranges: Array<string> = []
for(let range of compatRange.split(",")) {
range = range.trim()
// An empty range isn't supported by Julia
if (!range) {
return null
}
// NPM's semver doesn't understand unicode characters such as `≥` so we'll convert to alternatives
range = range.replace("≥", ">=").replace("≤", "<=")
// Cleanup whitespace. Julia only allows whitespace between the specifier and version with certain specifiers
range = range.replace(/\s+/g, " ").replace(/(?<=(>|>=|≥|<)) (?=\d)/g, "")
if (!semver.validRange(range) || range.split(/(?<! -) (?!- )/).length > 1 || range.startsWith("<=") || range === "*") {
return null
} else if (range.search(/^\d/) === 0 && !range.includes(" ")) {
// Compat version is just a basic version number (e.g. 1.2.3). Since Julia's Pkg.jl's uses caret
// as the default specifier (e.g. `1.2.3 == ^1.2.3`) and NPM's semver uses tilde as the default
// specifier (e.g. `1.2.3 == 1.2.x == ~1.2.3`) we will introduce the caret specifier to ensure the
// orignal intent is respected.
// https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format
// https://github.com/npm/node-semver#x-ranges-12x-1x-12-
range = "^" + range
}
ranges.push(range)
}
return semver.validRange(ranges.join(" || "))
}
/**
* @returns An array of version ranges compatible with the Julia project
*/
export function readJuliaCompatRange(projectFileContent: string): string {
let compatRange: string | null
let meta = toml.parse(projectFileContent)
if (meta.compat?.julia !== undefined) {
compatRange = validJuliaCompatRange(meta.compat.julia)
} else {
compatRange = "*"
}
if (!compatRange) {
throw new Error(`Invalid version range found in Julia compat: ${compatRange}`)
}
return compatRange
}
export function getJuliaVersion(availableReleases: string[], versionInput: string, includePrerelease: boolean = false, juliaCompatRange: string = ""): string {
// Note: `juliaCompatRange` is ignored unless `versionInput` is `min`
let version: string | null
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
// versionInput is a valid version or a nightly version, use it directly
version = versionInput
} else if (versionInput == "min") {
// Resolve "min" to the minimum supported Julia version compatible with the project file
if (!juliaCompatRange) {
throw new Error('Unable to use version "min" when the Julia project file does not specify a compat for Julia')
}
version = semver.minSatisfying(availableReleases, juliaCompatRange, {includePrerelease})
} else if (versionInput == "lts") {
version = semver.maxSatisfying(availableReleases, LTS_VERSION, { includePrerelease: false });
} else if (versionInput == "pre") {
version = semver.maxSatisfying(availableReleases, MAJOR_VERSION, { includePrerelease: true });
} else {
// Use the highest available version that matches versionInput
version = semver.maxSatisfying(availableReleases, versionInput, {includePrerelease})
}
if (!version) {
throw new Error(`Could not find a Julia version that matches ${versionInput}`)
}
@@ -173,6 +278,7 @@ export function getFileInfo(versionInfo, version: string, arch: string) {
}
if (!versionInfo[version]) {
core.error(`Encountered error: ${err}`)
throw err
}
@@ -193,8 +299,39 @@ export function getFileInfo(versionInfo, version: string, arch: string) {
}
}
}
// The following block is just to provide improved log messages in the CI logs.
// We specifically want to improve the case where someone is trying to install
// Julia 1.6 or 1.7 on Apple Silicon (aarch64) macOS.
{
const one_fileext_is_targz = (fileExt1 == "tar.gz") || (fileExt2 == "tar.gz");
const one_fileext_is_dmg = (fileExt1 == "dmg") || (fileExt2 == "dmg");
const one_fileext_is_targz_and_other_is_dmg = one_fileext_is_targz && one_fileext_is_dmg;
// We say that "this Julia version does NOT have native binaries for Apple Silicon"
// if and only if "this Julia version is < 1.8.0"
const this_julia_version_does_NOT_have_native_binaries_for_apple_silicon = semver.lt(
version,
'1.8.0',
);
const this_is_macos = osPlat == 'darwin';
if (this_is_macos && one_fileext_is_targz_and_other_is_dmg && this_julia_version_does_NOT_have_native_binaries_for_apple_silicon) {
const msg = `It looks like you are trying to install Julia 1.6 or 1.7 on ` +
`the "macos-latest" runners.\n` +
`"macos-latest" now resolves to "macos-14", which run on Apple ` +
`Silicon (aarch64) macOS machines.\n` +
`Unfortunately, Julia 1.6 and 1.7 do not have native binaries ` +
`available for Apple Silicon macOS.\n` +
`Therefore, it is not possible to install Julia with the current ` +
`constraints.\n` +
`For instructions on how to fix this error, please see the following Discourse post: ` +
`https://discourse.julialang.org/t/how-to-fix-github-actions-ci-failures-with-julia-1-6-or-1-7-on-macos-latest-and-macos-14/117019`
core.error(msg);
}
}
}
core.error(`Encountered error: ${err}`)
throw err
}

View File

@@ -1,20 +1,22 @@
import * as core from '@actions/core'
import * as exec from '@actions/exec'
import * as tc from '@actions/tool-cache'
import * as fs from 'fs'
import * as https from 'https'
import * as os from 'os'
import * as path from 'path'
import * as installer from './installer'
// Note: before we index into this dict, we always first do `.toLowerCase()` on
// the key.
//
// Therefore, this dict does not need to account for differences in case.
const archSynonyms = {
'x86': 'x86',
'X86': 'x86',
'x64': 'x64',
'X64': 'x64',
'x86_64': 'x64',
'aarch64': 'aarch64',
'ARM64': 'aarch64',
'arm64': 'aarch64'
}
@@ -38,28 +40,52 @@ async function run() {
})
}
// Inputs
const versionInput = core.getInput('version')
const includePrereleases = core.getInput('include-all-prereleases') == 'true'
const originalArchInput = core.getInput('arch')
// Inputs.
// Note that we intentionally strip leading and lagging whitespace by using `.trim()`
const versionInput = core.getInput('version').trim()
const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true'
const originalArchInput = core.getInput('arch').trim()
const projectInput = core.getInput('project').trim() // Julia project file
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
// while the strategy matrix only contains a key `${{ matrix.version }}`.
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
// is worse than failing the build.
if (!versionInput) {
if (!versionInput) { // if `versionInput` is an empty string
throw new Error('Version input must not be null')
}
if (!originalArchInput) {
if (versionInput == '1.6') {
core.notice('[setup-julia] If you are testing 1.6 as a Long Term Support (lts) version, consider using the new "lts" version specifier instead of "1.6" explicitly, which will automatically resolve the current lts.')
}
if (!originalArchInput) { // if `originalArchInput` is an empty string
throw new Error(`Arch input must not be null`)
}
const arch = archSynonyms[originalArchInput]
let processedArchInput: string;
if (originalArchInput == "default") {
// If the user sets the `arch` input to `default`, then we use the
// architecture of the machine that we are running on.
processedArchInput = os.arch();
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`)
} else {
processedArchInput = originalArchInput;
}
// Note: we convert the key `processedArchInput` to lower case
// before we index into the `archSynonyms` dict.
const arch = archSynonyms[processedArchInput.toLowerCase()]
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`)
// Determine the Julia compat ranges as specified by the Project.toml only for special versions that require them.
let juliaCompatRange: string = "";
if (versionInput === "min") {
const projectFilePath = installer.getProjectFilePath(projectInput)
juliaCompatRange = installer.readJuliaCompatRange(fs.readFileSync(projectFilePath).toString())
}
const versionInfo = await installer.getJuliaVersionInfo()
const availableReleases = await installer.getJuliaVersions(versionInfo)
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases)
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases, juliaCompatRange)
core.debug(`selected Julia version: ${arch}/${version}`)
core.setOutput('julia-version', version)