Skip to content

Build and release OpenAM nightly #789

Build and release OpenAM nightly

Build and release OpenAM nightly #789

name: Build and release OpenAM nightly
on:
workflow_dispatch:
schedule:
- cron: '0 18 * * *'
jobs:
build:
runs-on: ubuntu-22.04
timeout-minutes: 60
strategy:
matrix:
java: [ '8' ]
env:
GIT_ORIGIN: https://github.com/openam-jp
GIT_BRANCH: master
RELEASE_NAME: nightly
ARTIFACTS: |
./openam/openam-distribution/openam-distribution-ssoconfiguratortools/target/SSOConfiguratorTools-15.0.0-SNAPSHOT.zip
./openam/openam-distribution/openam-distribution-ssoadmintools/target/SSOAdminTools-15.0.0-SNAPSHOT.zip
./openam/openam-server/target/OpenAM-15.0.0-SNAPSHOT.war
LICENSE_BODY: "This project is subject to [the Common Development and Distribution License (CDDL)](LICENSE.md). \
Please check all the terms of the license before using these artifacts."
REPO_NAMES: |
forgerock-parent
forgerock-bom
forgerock-build-tools
forgerock-i18n-framework
forgerock-guice
forgerock-guava
forgerock-ui
forgerock-commons
forgerock-persistit
forgerock-bloomfilter
opendj-sdk
opendj
openam
steps:
- name: Set up JDK ${{ matrix.java }}
uses: actions/[email protected]
with:
java-version: ${{ matrix.java }}
distribution: 'temurin'
- name: Build in order
id: build
run: |
for REPO in ${REPO_NAMES}; do
git clone ${GIT_ORIGIN}/${REPO} -b ${GIT_BRANCH}
#----------------------------------------
# Ad hoc patch for maven-default-http-blocker
#----------------------------------------
if [ "${REPO}" == 'opendj' ]; then
sed -ie "s|<url>http://download.oracle.com|<url>https://download.oracle.com|g" opendj/opendj-server-legacy/pom.xml
fi
if [ "${REPO}" == 'openam' ]; then
sed -ie "s|<url>http://download.oracle.com|<url>https://download.oracle.com|g" openam/openam-core/pom.xml
fi
#----------------------------------------
mvn clean install -f ${REPO}
if [ $? -ne 0 ]; then
exit 1;
fi
done
- name: Delete previous releases
id: delete_previous_releases
if: ${{ steps.build.outcome == 'success' }}
uses: actions/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
/*
* Delete previous 'nightly' release.
* - Search all releases by name 'nightly'.
* - Attempts to delete all releases by ID and aborts build if deletion fails.
*/
const { RELEASE_NAME } = process.env;
const { owner, repo } = context.repo;
await github.rest.repos.listReleases({
owner,
repo,
}).then((res) => {
res.data.forEach(async releaseInfo => {
if (releaseInfo.name === RELEASE_NAME) {
await github.rest.repos.deleteRelease({
owner: owner,
repo: repo,
release_id: `${releaseInfo.id}`,
}).then((res) => {
console.log(`Deleted the previous release id: '${releaseInfo.id}'`);
}).catch((e) => {
core.setFailed(`Cannot delete previous release ${releaseInfo.id}: ${e}`);
})
}
});
}).catch((e) => {
core.setFailed(`Cannot list releases: ${e}`);
})
- name: Delete previous tag
id: delete_previous_tag
uses: actions/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
/*
* Delete previous 'nightly' tag.
* - Delete a tag 'tags/nightly'.
* - If not found, proceed to the next step.
*/
const { RELEASE_NAME } = process.env;
const { owner, repo } = context.repo;
await github.rest.git.deleteRef({
owner: owner,
repo: repo,
ref: `tags/${RELEASE_NAME}`,
}).then((res) => {
console.log(`Deleted the previous tag: '${res.id}'`);
}).catch((e) => {
console.log(`Cannot delete the previous tag: ${e}`);
})
- name: Create the release
id: create_release
if: ${{ steps.delete_previous_releases.outcome == 'success' }}
uses: actions/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
/*
* Create the 'nightly' release.
* - Using 'github-script' because 'create-release' action is no longer maintained.
* - Set the following attributes: Name, CDDL-license, pre-release indication.
* - Output release id. (Usage: "${{ steps.create_release.outputs.result }}")
*/
const { RELEASE_NAME } = process.env;
const { LICENSE_BODY } = process.env;
const { owner, repo } = context.repo;
const result = await github.rest.repos.createRelease({
owner: owner,
repo: repo,
name: RELEASE_NAME,
tag_name: RELEASE_NAME,
body: LICENSE_BODY,
generate_release_notes: false,
draft: false,
prerelease: true,
}).catch((e) => {
core.setFailed(`Cannot create release '${RELEASE_NAME}': ${e}`);
})
// Pass release ID to next step.
console.log(`Created release '${RELEASE_NAME}': ${result.data.id}`);
return `${result.data.id}`;
- name: Update the release page status
id: update_release_status
if: ${{ steps.create_release.outcome == 'success' }}
uses: actions/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
/*
* Update the 'nightly' release page status.
* - Using 'github-script'.
* - Set the following attributes: draft, prerelease.
* - Output release id. (Usage: "${{ steps.update_release_status.outputs.result }}")
*/
const { owner, repo } = context.repo;
const releaseId = `${{ steps.create_release.outputs.result }}`;
const result = await github.rest.repos.updateRelease({
owner: owner,
repo: repo,
release_id: releaseId,
draft: false,
prerelease: true,
}).catch((e) => {
core.setFailed(`Cannot update release page '${RELEASE_NAME}': ${e}`);
})
console.log(`result.data.draft : ${result.data.draft}`);
console.log(`result.data.prerelease : ${result.data.prerelease}`);
// Pass release ID to next step.
return `${result.data.id}`;
- name: Upload artifacts
id: upload_artifacts
if: ${{ steps.create_release.outcome == 'success' }}
uses: actions/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
/*
* Upload artifacts to the 'nightly' release.
*/
const fs = require('fs');
const path = require('path');
const { owner, repo } = context.repo;
const releaseId = `${{ steps.create_release.outputs.result }}`;
const artifacts = process.env.ARTIFACTS.split("\n");
if (releaseId === 'undefined') {
core.setFailed('Release ID is undefined.');
return 1;
}
await artifacts.forEach(async artifactPath => {
// Skip if the path element is empty.
if (artifactPath.trim() === '') {
return;
}
var filename = path.parse(artifactPath).base;
await github.rest.repos.uploadReleaseAsset({
owner: owner,
repo: repo,
release_id: releaseId,
name: filename,
data: await fs.readFileSync(artifactPath)
}).then((res) => {
console.log(`Uploaded: ${filename} (${artifactPath})`);
}).catch((e) => {
core.setFailed(`Cannot upload asset '${filename}': ${e}`);
})
});