Skip to content

Commit

Permalink
Update workflows.
Browse files Browse the repository at this point in the history
  • Loading branch information
io7m committed May 3, 2024
1 parent e0081bd commit 500b4a3
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 4 deletions.
162 changes: 162 additions & 0 deletions .github/workflows/Tools.java
@@ -0,0 +1,162 @@
/*
* Copyright © 2024 Mark Raynsford <code@io7m.com> https://www.io7m.com
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.TreeMap;

public final class Tools
{
private static final TreeMap<String, OpType> OPS =
new TreeMap<>();

static {
final var opsList = List.of(
new ShowProjectVersion(),
new ShowProjectIsSnapshot()
);

for (final var op : opsList) {
OPS.put(op.name(), op);
}
}

private Tools()
{

}

private interface OpType
{
String name();

void execute(String[] args)
throws Exception;
}

private static String getProjectVersion(
final File file)
throws Exception
{
final var documentBuilders =
DocumentBuilderFactory.newInstance();
final var documentBuilder =
documentBuilders.newDocumentBuilder();
final var document =
documentBuilder.parse(file);

final var xPathFactory =
XPathFactory.newInstance();
final var xPath =
xPathFactory.newXPath();

final var nodes =
(NodeList) xPath.evaluate(
"//project/version",
document,
XPathConstants.NODESET
);

for (var i = 0; i < nodes.getLength(); i++) {
final var node = nodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
return node.getTextContent().trim();
}
}

throw new IOException(
"Could not locate a //project/version node!"
);
}

private static final class ShowProjectVersion implements OpType
{
ShowProjectVersion()
{

}

@Override
public String name()
{
return "ShowProjectVersion";
}

@Override
public void execute(
final String[] args)
throws Exception
{
System.out.print("IO7M_PROJECT_VERSION=");
System.out.println(getProjectVersion(new File(args[1])));
}
}

private static final class ShowProjectIsSnapshot implements OpType
{
ShowProjectIsSnapshot()
{

}

@Override
public String name()
{
return "ShowProjectIsSnapshot";
}

@Override
public void execute(
final String[] args)
throws Exception
{
System.out.print("IO7M_PROJECT_VERSION_IS_SNAPSHOT=");
System.out.println(
getProjectVersion(new File(args[1])).endsWith("-SNAPSHOT")
);
}
}

public static void main(
final String[] args)
throws Exception
{
if (args.length == 0) {
System.err.println("Usage: command");
System.exit(1);
}

final var op = OPS.get(args[0]);
if (op == null) {
System.err.println("Unrecognized command.");
System.err.println(" Must be one of:");
for (final var name : OPS.keySet()) {
System.err.print(" ");
System.err.println(name);
}
System.exit(1);
}

op.execute(args);
}
}
58 changes: 58 additions & 0 deletions .github/workflows/deploy-release.sh
@@ -0,0 +1,58 @@
#!/bin/sh

fatal()
{
echo "fatal: $1" 1>&2
exit 1
}

if [ -z "${MAVEN_CENTRAL_USERNAME}" ]
then
fatal "MAVEN_CENTRAL_USERNAME is not set."
fi

if [ -z "${MAVEN_CENTRAL_PASSWORD}" ]
then
fatal "MAVEN_CENTRAL_PASSWORD is not set."
fi

(cat <<EOF
<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>io7m</id>
<properties>
<gpg.useagent>true</gpg.useagent>
<gpg.keyname>github-ci-maven-rsa-key</gpg.keyname>
<io7m.deployment>true</io7m.deployment>
</properties>
</profile>
</profiles>
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>${MAVEN_CENTRAL_USERNAME}</username>
<password>${MAVEN_CENTRAL_PASSWORD}</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>${MAVEN_CENTRAL_USERNAME}</username>
<password>${MAVEN_CENTRAL_PASSWORD}</password>
</server>
</servers>
</settings>
EOF
) > "$HOME/.m2/settings.xml" || fatal "could not update $HOME/.m2/settings.xml"

exec mvn \
-Dio7m.release=true \
-Dio7m.deployment=true \
--batch-mode \
--strict-checksums \
-DskipTests=true \
-DskipITs=true deploy
44 changes: 44 additions & 0 deletions .github/workflows/deploy-snapshot.sh
@@ -0,0 +1,44 @@
#!/bin/sh

fatal()
{
echo "fatal: $1" 1>&2
exit 1
}

if [ -z "${MAVEN_CENTRAL_USERNAME}" ]
then
fatal "MAVEN_CENTRAL_USERNAME is not set."
fi

if [ -z "${MAVEN_CENTRAL_PASSWORD}" ]
then
fatal "MAVEN_CENTRAL_PASSWORD is not set."
fi

(cat <<EOF
<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>${MAVEN_CENTRAL_USERNAME}</username>
<password>${MAVEN_CENTRAL_PASSWORD}</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>${MAVEN_CENTRAL_USERNAME}</username>
<password>${MAVEN_CENTRAL_PASSWORD}</password>
</server>
</servers>
</settings>
EOF
) > "$HOME/.m2/settings.xml" || fatal "could not update $HOME/.m2/settings.xml"

exec mvn \
--batch-mode \
--strict-checksums \
-DskipTests=true \
-DskipITs=true deploy
28 changes: 28 additions & 0 deletions .github/workflows/deploy.linux.temurin.lts.yml
@@ -0,0 +1,28 @@
name: deploy.linux.temurin.lts

on:
push:
tags: [ com.io7m.jsay-* ]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: JDK
uses: actions/setup-java@v4
with:
java-version: 21
distribution: 'temurin'

- name: Import signing key
env:
PGP_SIGNING_KEY: ${{ secrets.PGP_SIGNING_KEY }}
run: echo "${PGP_SIGNING_KEY}" | gpg --import

- name: Deploy release
env:
MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
run: .github/workflows/deploy-release.sh
14 changes: 13 additions & 1 deletion .github/workflows/main.linux.temurin.current.yml
Expand Up @@ -11,16 +11,28 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: JDK
uses: actions/setup-java@v4
with:
java-version: 22
distribution: 'temurin'

- name: Collect project version
id: project_version
run: java .github/workflows/Tools.java ShowProjectVersion pom.xml >> "$GITHUB_OUTPUT"

- name: Collect project snapshot
id: project_is_snapshot
run: java .github/workflows/Tools.java ShowProjectIsSnapshot pom.xml >> "$GITHUB_OUTPUT"

- name: Build
run: mvn --errors clean verify site
run: mvn --batch-mode --strict-checksums --errors clean verify site

- name: Upload test logs
uses: actions/upload-artifact@v4
if: always()
with:
name: test-logs
path: ./com.io7m.jsay.tests/target/surefire-reports

22 changes: 21 additions & 1 deletion .github/workflows/main.linux.temurin.lts.yml
Expand Up @@ -11,21 +11,41 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: JDK
uses: actions/setup-java@v4
with:
java-version: 21
distribution: 'temurin'

- name: Collect project version
id: project_version
run: java .github/workflows/Tools.java ShowProjectVersion pom.xml >> "$GITHUB_OUTPUT"

- name: Collect project snapshot
id: project_is_snapshot
run: java .github/workflows/Tools.java ShowProjectIsSnapshot pom.xml >> "$GITHUB_OUTPUT"

- name: Build
run: mvn --errors clean verify site
run: mvn --batch-mode --strict-checksums --errors clean verify site

- name: Upload test logs
uses: actions/upload-artifact@v4
if: always()
with:
name: test-logs
path: ./com.io7m.jsay.tests/target/surefire-reports

- name: Coverage
uses: codecov/codecov-action@v4.3.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: com.io7m.jsay.tests/target/site/jacoco-aggregate/jacoco.xml

- name: Deploy snapshot
if: ${{ steps.project_is_snapshot.outputs.IO7M_PROJECT_VERSION_IS_SNAPSHOT == 'true' }}
env:
MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
run: .github/workflows/deploy-snapshot.sh

14 changes: 13 additions & 1 deletion .github/workflows/main.windows.temurin.current.yml
Expand Up @@ -11,16 +11,28 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: JDK
uses: actions/setup-java@v4
with:
java-version: 22
distribution: 'temurin'

- name: Collect project version
id: project_version
run: java .github/workflows/Tools.java ShowProjectVersion pom.xml >> "$GITHUB_OUTPUT"

- name: Collect project snapshot
id: project_is_snapshot
run: java .github/workflows/Tools.java ShowProjectIsSnapshot pom.xml >> "$GITHUB_OUTPUT"

- name: Build
run: mvn --errors clean verify site
run: mvn --batch-mode --strict-checksums --errors clean verify site

- name: Upload test logs
uses: actions/upload-artifact@v4
if: always()
with:
name: test-logs
path: ./com.io7m.jsay.tests/target/surefire-reports

0 comments on commit 500b4a3

Please sign in to comment.