Disco API - OpenJDK distributions as a service

han_solo 1,122 views 43 slides Jun 24, 2021
Slide 1
Slide 1 of 96
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96

About This Presentation

At foojay.io we've spent some time creating a little api that should help you to discover builds of OpenJDK from different distributions in a general way. In this session, I will give a short introduction to what the Disco API is and how it can help you find the JDK/JRE of your choice. At the mo...


Slide Content

DISCO API

Gerrit Grunwald | Senior Developer Advocate | foojay.io
ABOUTME.

Discover distributions
of OpenJDK as a
service…

Example…

You need
JDK 11.0.8

Question1.

Which
distribution…?

Question2.

Does the distribution
support 11.0.8…?

Question3.

Does the distribution
support your OS…?

Question4.

Where to get
it from…?

Question5.

Are you allowed
to use it…?

That who have the choice...
๏Adopt OpenJDK
๏Corretto
๏Dragonwell
๏(GraalVM CE)
๏Liberica
๏(Liberica Native)
๏(Mandrel)
๏Microsoft
๏OJDK Build
๏Open Logic
๏Oracle
๏Oracle OpenJDK
๏RedHat
๏SAP Machine
๏Temurin
๏Trava
๏Zulu
๏Zulu Prime

The situation...
๏We have many different distributions
๏Not all distributions support all versions
๏Most distributions are free but some are not
๏Some distributions have special features
๏Every distribution has it’s own way to get it

The Idea

What about having a
General API that…

Serves information about…
๏Distributions
๏Versions
๏Platforms
๏Operating Systems
๏Architectures
๏Archive types
๏Release status
๏Terms of support
๏Package types
๏Signatures

DISCO API

REST
Endpoints

https://api.foojay.io
๏/disco/v2.0/major_versions
๏/disco/v2.0/distributions
๏/disco/v2.0/packages
๏/disco/v2.0/packages/jdks
๏/disco/v2.0/packages/jres
๏/disco/v2.0/packages/yaml
๏/disco/v2.0/ephemeral_ids

https://api.foojay.io/disco/v2.0/
major_versions

/major_versions?
๏ea=true (Early Access)
๏ga=true (General Availability)
๏maintained=true* (Actively maintained, at the moment 7, 8, 11, 13, 15, 16, 17-ea, 18-ea)
*will change over time

{
"result": [
{
"major_version": 17,
"term_of_support": "LTS",
"maintained": true,
"versions": [
"17-ea"
]
},
{
"major_version": 16,
"term_of_support": "STS",
"maintained": true,
"versions": [
"16-ea"
]
},
{
"major_version": 15,
"term_of_support": "MTS",
"maintained": true,
"versions": [
"15.0.1",
"15.0.1-ea",
"15",
"15-ea"
]
},
. . .
Returns a list of all
major versions
including early access
versions in a JSON
format
/major_versions

/major_versions
๏/latest_sts
๏/latest_mts
๏/latest_lts
๏/latest_ga
๏/latest_ea
๏/MAJOR_VERSION (e.g. 13)
๏/MAJOR_VERSION/ea (e.g. 13/ea)

https://api.foojay.io/disco/v2.0/
distributions

/distributions
๏/NAME of distribution (e.g. /zulu)

{
"result": [
{
"name": "Zulu",
"api_parameter": "zulu",
"hash_algorithm": "",
"hash_uri": "",
"signature_type": "",
"signature_algorithm": "",
"signature_uri": "",
"versions": [
"17-ea",
"16-ea",
"15.0.1",
"15",
"15-ea",
"14.0.2",
"14.0.1",
"14",
"14-ea",
"13.0.5.1",
"13.0.5",
"13.0.4",
"13.0.3",
"13.0.2",
"13.0.1",
"13",
"12.0.2",
"12.0.1",
"12",
"11.0.9.1",
"11.0.9",
"11.0.8",
"11.0.7",
"11.0.6",
...
Returns info about a
specific distribution
including all it’s general
availability and early
access updates in
JSON format
/distributions/zulu

https://api.foojay.io/disco/v2.0/
packages

/packages?
๏version
๏from_version
๏to_version
๏version_by_definition
๏distro
๏architecture
๏archive_type
๏package_type
๏operating_system
๏libc_type
๏release_status
๏term_of_support
๏bitness
๏javafx_bundled
๏directly_downloadable*
๏latest

directly_downloadable*
๏Oracle JDK
๏RedHat JDK
directly_downloadable =>false
We only return the link to their download page !!!

{
"result": [
{
"id": "43afdc6785055999f3104208d4b9d703 ",
"archive_type": "tar.gz",
"distribution": "zulu",
"major_version": 16,
"java_version": "16.0.1",
"distribution_version ": "16.30.15",
"latest_build_available ": true,
"release_status": "ga",
"term_of_support": "sts",
"operating_system": "linux",
"lib_c_type": "musl",
"architecture": "x64",
"package_type": "jdk",
"javafx_bundled": false,
"directly_downloadable ": true,
"filename": "zulu16.30.15-ca-jdk16.0.1-linux_musl_x64.tar.gz ",
"ephemeral_id": "c4ffb7a327eebd365750ab7ad6b585bdaf224e9a ",
"links": {
"pkg_info_uri": "https://api.foojay.io/disco/v2.0/ephemeral_ids/
c4ffb7a327eebd365750ab7ad6b585bdaf224e9a "
},
"free_use_in_production ": true,
"feature": []
},
{
...
}
],
"message": "10 package(s) found"
}
Returns a list of all
packages in JSON
format
/packages

OpenSource

Source
https://github.com/foojay2020/discoapi

Examples...

I need the latest JDK,
what is avaiable ?

Latest JDK available
[
{
"id": "f5f69da2537cfbf7e6f26e484410b8d1 ",
"archive_type": "tar.gz",
"distribution": "zulu",
"major_version": 15,
"java_version": "15.0.1",
"distribution_version ": "15.28.51.0",
"latest_build_available ": true,
"release_status": "ga",
"term_of_support": "mts",
"operating_system": "linux",
"lib_c_type": "musl",
"architecture": "x64",
"package_type": "jdk",
"javafx_bundled": false,
"directly_downloadable ": true,
"filename": "zulu15.28.51-ca-jdk15.0.1-linux_musl_x64.tar.gz ",
"ephemeral_id": "339f5f69da2537cfbf7e6f26e484410b8d11610452685 "
},
{
"id": "aa4851ec455afb6efce8e4bd0a18ee63 ",
"archive_type": "zip",
"distribution": "zulu",
"major_version": 15,
. . .
Returns a list of all packages
found that contain a JDK and
have the latest available
version (here 15.0.1)
https://api.foojay.io/disco/v2.0/packages?package_type=jdk&latest=available

What versions are
available in
distribution XYZ ?

Versions available in distribution
{
"name": "Zulu",
"api_parameter": "zulu",
"versions": [
"17-ea",
"16-ea",
"15.0.1",
"15",
"15-ea",
"14.0.2",
"14.0.1",
"14",
"14-ea",
"13.0.5.1",
"13.0.5",
"13.0.4",
"13.0.3",
"13.0.2",
"13.0.1",
"13",
"12.0.2",
"12.0.1",
"12",
"11.0.9.1",
"11.0.9",
. . .
Returns a list of versions in
the Zulu distribution
including all it’s general
availability and early access
updates in JSON format
https://api.foojay.io/disco/v2.0/distributions/zulu

Who has
version
11.0.9.1 ?

Who has version 11.0.9.1
[
{
"id": "91b37ae0ab88863ba65845b2e1ba5a5d ",
"archive_type": "rpm",
"distribution": "zulu",
"major_version": 11,
"java_version": "11.0.9.1",
"distribution_version ": "11.43.55.0",
"latest_build_available ": true,
"release_status": "ga",
"term_of_support": "lts",
"operating_system": "linux",
"lib_c_type": "glibc",
"architecture": "x86",
"package_type": "jre",
"javafx_bundled": false,
"directly_downloadable ": true,
"filename": "zulu11.43.55-ca-jre11.0.9.1-linux.i686.rpm ",
"ephemeral_id": "34091b37ae0ab88863ba65845b2e1ba5a5d1610452754 "
},
{
"id": "f365a9db0f0a6954b0d4b53e5c42f797 ",
"archive_type": "zip",
"distribution": "zulu",
"major_version": 11,
. . .
Returns a list of all packages
that have the version number
11.0.9.1 from all distributions
https://api.foojay.io/disco/v2.0/packages?version=11.0.9.1

The latest LTS JDK
for Mac OS
incl. JavaFX ?

Latest LTS JDK for Mac incl. FX
[
{
"id": "75f55e22ca634f0a39bc88fcff49b9c1 ",
"archive_type": "tar.gz",
"distribution": "zulu",
"major_version": 11,
"java_version": "11.0.9.1",
"distribution_version ": "11.43.55.0",
"latest_build_available ": true,
"release_status": "ga",
"term_of_support": "lts",
"operating_system": "macos",
"lib_c_type": "libc",
"architecture": "x64",
"package_type": "jdk",
"javafx_bundled": true,
"directly_downloadable ": true,
"filename": "zulu11.43.55-ca-fx-jdk11.0.9.1-macosx_x64.tar.gz ",
"ephemeral_id": "41175f55e22ca634f0a39bc88fcff49b9c11610454032 "
},
{
"id": "3edab9b6f6661cc5a64ea19e439959e6 ",
"archive_type": "dmg",
"distribution": "zulu",
"major_version": 11,
. . .
Returns a list of all packages
that have the latest available
long term stable version (here
11.0.9.1) for Mac OS incl.
JavaFX from all distributions
https://api.foojay.io/disco/v2.0/packages?
version_by_definition=latest_lts&package_type=jdk&operating_system=macos&javafx_bundled=true&latest=per_version

Is there an update
available for 11.0.8 ?

Update available for 11.0.8
{
"major_version": 11,
"term_of_support": "LTS",
"maintained": true,
"versions": [
"11.0.9.1",
"11.0.9",
"11.0.8",
"11.0.7",
"11.0.6",
"11.0.5",
"11.0.4",
"11.0.3",
"11.0.2",
"11.0.1",
"11"
]
}
Returns a list of all general
availability updates of the
major version 11.
https://api.foojay.io/disco/v2.0/major_versions/11

JDK 1.8.0_275 for
Windows as msi

JDK 1.8.0_275 for Windows as msi
[
{
"id": "23310311f36f9092d8db58880dc55ec0 ",
"archive_type": "msi",
"distribution": "zulu",
"major_version": 8,
"java_version": "8.0.275",
"distribution_version ": "8.50.0.51",
"latest_build_available ": true,
"release_status": "ga",
"term_of_support": "lts",
"operating_system": "windows",
"lib_c_type": "c_std_lib",
"architecture": "x86",
"package_type": "jdk",
"javafx_bundled": false,
"directly_downloadable ": true,
"filename": "zulu8.50.0.51-ca-jdk8.0.275-win_i686.msi ",
"ephemeral_id": "32923310311f36f9092d8db58880dc55ec01610454148 "
},
{
"id": "949a657c47c2b71d58aebc0b022d4688 ",
"archive_type": "msi",
"distribution": "zulu",
"major_version": 8,
. . .
Returns a list of all packages
with the version 8.0.275 for
Windows with an archive type
of msi from all distributions
https://api.foojay.io/disco/v2.0/packages?
package_type=jdk&version=1.8.0_275&operating_system=windows&archive_type=msi

IDE plugins

Intellij
plugin

The plugin let you discover and download a
JDK to your local machine.
To install it, search for „DiscoIdea“ on the
Intellij Marketplace.
A plugin to discover/download a JDK
Intellij Plugin

Eclipse
plugin

The plugin let you discover and download a
JDK to your local machine.
To install it, search for „DiscoEclipse“ on the
Eclipse Marketplace.
A plugin to discover/download a JDK
Eclipse Plugin

NetBeans
plugin

NetBeans plugin

NetBeans plugin

NetBeans plugin

NetBeans plugin

NetBeans plugin

Visual Studio
Code
plugin

The plugin let you discover and
download a JDK to your local machine.
To install it, search for „DiscoVSC“ on
the Visual Studio Code Marketplace.
A plugin to discover/download a JDK
Visual Studio Code Plugin

Browser plugins

Chrome
extension

The extension let you discover and
download a JDK to your local machine.
To install it, search for „DiscoChrome“
on the chrome web store.
An extension to discover/download a JDK
Chrome Extension

Chrome Extension

Firefox
add-on

The extension let you discover and
download a JDK to your local machine.
To install it, search for „DiscoFox“ on
the firefox addons page.
An extension to discover/download a JDK
Firefox Add-on

Edge
extension

The extension let you discover and
download a JDK to your local machine.
To install it, search for „DiscoEdge“ on
the Edge plugins page.
An extension to discover/download a JDK
Edge Extension

Safari
extension

The extension let you discover and
download a JDK to your local machine.
To install it, search for „DiscoSafari“ on
the Mac app store.
An extension to discover/download a JDK
Safari Extension

Other plugins

Website
plugin

The snippet let you discover and download
a JDK to your local machine.
Find an instruction on how to install it for
example on blogger at Harmonic Code
A html snippet to discover/download a JDK
Website Plugin

Shell
scripts
$_

Scripts
๏disco-distributions.sh
๏disco-major-versions.sh
๏disco-packages.sh
jq needs to be installed!!!

disco-distribution.sh
################################
# #
# foojay jdk discovery api #
# #
# disco-distributions.sh #
# #
################################
Be aware that you need to have jq installed
Script parameters:
--version : Returns a list of distributions that support the given version
--name : Returns a distribution with the given name if available
--help : Shows this info
disco-distributions.sh
disco-distributions.sh --version 13.0.5.1
disco-releases.sh --help
Enables you to call the
distributions endpoint of the
disco api and retrieve results
in json format
bash disco-distributions.sh --help

disco-major-versions.sh
################################
# #
# foojay jdk discovery api #
# #
# disco-major-versions.sh #
# #
################################
Be aware that you need to have jq installed
Script parameters:
--help : Shows this info
--major-version : Major Version e.g. 1, 5, 9, 11, 18
disco-major-versions.sh
disco-major-versions.sh --maintained true --ea true --ga true
disco-major-versions.sh --ea true
disco-major-versions.sh --ga true
disco-major-versions.sh --version 11 --ea true
disco-major-versions.sh --version 11 --ga true
disco-major-verions.sh --help
Enables you to call the major
versions endpoint of the disco
api and retrieve results in json
format
bash disco-major-versions.sh --help

disco-packages.sh
################################
# #
# foojay jdk discovery api #
# #
# disco-packages.sh #
# #
################################
Be aware that you need to have jq and wget installed
Script parameters:
--help : Shows this info
--version : Version (mandatory or version by definition) e.g. 1.8.0_265 or 11 or 13.0.5.1
--version_by_definition : Version by definition (mandatory if no version) e.g. latest, latest_sts, latest_mts,
latest_lts
--distro : Distribution e.g. aoj, aoj_openj9, dragonwell, corretto, liberica,
oracle_open_jdk, redhat, sap_machine, zulu
--architecture : Architecture e.g. aarch64, arm, arm64, mips, ppc, ppc64, ppc64le,
riscv64, s390x, sparc, sparcv9, x64, x86, amd64
--archive_type : File extension e.g. cab, deb, dmg, exe, msi, pkg, rpm, tar, zip
--package_type : Package type e.g. jre, jdk
--operating_system : Operating System (mandatory) e.g. windows, macos, linux
--libc_type : Type of libc e.g. glibc, libc, musl, c_std_lib
--release_status : Release status e.g. ea, ga
--term_of_support : Term of support e.g. sts, mts, lts
--bitness : Bitness e.g. 32, 64
--javafx_bundled : With JavaFX e.g. true, false
--directly_downloadable : Directly downloadable e.g. true, false
--latest : Latest e.g. overall, per_distro
--dest : Destination e.g. /Users/HanSolo
Usage example:
disco-packages.sh --dest /Users/Hansolo --operating_system windows --version 1.8.0_265 --distro zulu --package_type jdk --
architecture x64 --archive_type zip --release_status ga
Enables you to call the
packages endpoint of the
disco api and retrieve results
in json format
bash disco-packages.sh --help

Source
https://github.com/foojay2020/discoscripts
</>

Other
tools

JDK Butler

The tools makes use of the
Disco API to let you discover
JDK’s and download them to
your local machine.
A tool that let you discover JDK’s
JDK Butler

Get it from github
https://github.com/HanSolo/jdkbutler/releases

JDK Mon

The tool scans every 3h a
folder that you can define for
installed JDK’s.
It checks for available updates
using the Disco API and
offers the download of the
update.
A tool that monitors all your installed JDK’s
JDK Mon

Get it from github
https://github.com/HanSolo/JDKMon/releases

github actions

When using github actions to
build your project you can use
setup-java@v1.
This will use Zulu as JDK to
build and run.
setup-java@v1
github actions
...
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-package: jdk
java-version: 11.0.10
- name: Build with gradle
run: ./gradlew build
...

When using github actions to
build your project you can use
setup-java@v2.
No default and you only can
choose between adopt,
adopt-openj9 and zulu.
setup-java@v2
github actions
...
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-package: jdk
java-version: '11.0.10'
distribution: 'zulu'
- name: Build with gradle
run: ./gradlew build
...

Make use of foojay’s setup-
java@disco to build your code
using the JDK of your choice.
If not defined it will default to
Zulu (as it was in [email protected]).
Use foojay2020/setup-java@disco
github actions
...
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11 Corretto
uses: foojay2020/setup-java@disco
with:
java-package: jdk
java-version: 11.0.10
distro: corretto
- name: Build with gradle
run: ./gradlew build
...

We have created a testing
matrix for the Disco API using
github actions. To check what
is available you can simply
take a look at the actions in
the project.
What is available? Check Disco Testing Matrix
github actions

Check it out on github
https://github.com/foojay2020/discoTestingMatrix

SDKMAN!

foojay.io