Create photon-targeting-JNI framework #1679
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build | |
on: | |
# Run on pushes to master and pushed tags, and on pull requests against master, but ignore the docs folder | |
push: | |
branches: [ master ] | |
tags: | |
- 'v*' | |
paths: | |
- '**' | |
- '!docs/**' | |
- '.github/**' | |
pull_request: | |
branches: [ master ] | |
paths: | |
- '**' | |
- '!docs/**' | |
- '.github/**' | |
jobs: | |
build-client: | |
name: "PhotonClient Build" | |
defaults: | |
run: | |
working-directory: photon-client | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 18 | |
- name: Install Dependencies | |
run: npm ci | |
- name: Build Production Client | |
run: npm run build | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: built-client | |
path: photon-client/dist/ | |
build-examples: | |
name: "Build Examples" | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Fetch tags | |
run: git fetch --tags --force | |
- name: Install RoboRIO Toolchain | |
run: ./gradlew installRoboRioToolchain | |
- name: Install Java 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
# Need to publish to maven local first, so that C++ sim can pick it up | |
# Still haven't figured out how to make the vendordep file be copied before trying to build examples | |
- name: Publish photonlib to maven local | |
run: | | |
chmod +x gradlew | |
./gradlew publishtomavenlocal -x check | |
- name: Build Java examples | |
working-directory: photonlib-java-examples | |
run: | | |
chmod +x gradlew | |
./gradlew copyPhotonlib -x check | |
./gradlew build -x check | |
- name: Build C++ examples | |
working-directory: photonlib-cpp-examples | |
run: | | |
chmod +x gradlew | |
./gradlew copyPhotonlib -x check | |
./gradlew build -x check | |
build-gradle: | |
name: "Gradle Build" | |
runs-on: ubuntu-22.04 | |
steps: | |
# Checkout code. | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Fetch tags | |
run: git fetch --tags --force | |
- name: Install Java 17 | |
uses: actions/setup-java@v3 | |
with: | |
java-version: 17 | |
distribution: temurin | |
- name: Install mrcal deps | |
run: sudo apt-get update && sudo apt-get install -y libcholmod3 liblapack3 libsuitesparseconfig5 | |
- name: Gradle Build | |
run: | | |
chmod +x gradlew | |
./gradlew photon-targeting:build photon-core:build photon-server:build -x check | |
- name: Gradle Tests | |
run: ./gradlew testHeadless -i --stacktrace | |
- name: Gradle Coverage | |
run: ./gradlew jacocoTestReport | |
- name: Publish Coverage Report | |
uses: codecov/codecov-action@v3 | |
with: | |
file: ./photon-server/build/reports/jacoco/test/jacocoTestReport.xml | |
- name: Publish Core Coverage Report | |
uses: codecov/codecov-action@v3 | |
with: | |
file: ./photon-core/build/reports/jacoco/test/jacocoTestReport.xml | |
build-offline-docs: | |
name: "Build Offline Docs" | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: Install dependencies | |
working-directory: docs | |
run: | | |
python -m pip install --upgrade pip | |
pip install sphinx sphinx_rtd_theme sphinx-tabs sphinxext-opengraph doc8 | |
pip install -r requirements.txt | |
- name: Build the docs | |
working-directory: docs | |
run: | | |
make html | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: built-docs | |
path: docs/build/html | |
build-photonlib-host: | |
env: | |
MACOSX_DEPLOYMENT_TARGET: 13 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: windows-2022 | |
artifact-name: Win64 | |
architecture: x64 | |
- os: macos-14 | |
artifact-name: macOS | |
architecture: aarch64 | |
- os: ubuntu-22.04 | |
artifact-name: Linux | |
name: "Photonlib - Build Host - ${{ matrix.artifact-name }}" | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install Java 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
architecture: ${{ matrix.architecture }} | |
- run: git fetch --tags --force | |
- run: | | |
chmod +x gradlew | |
./gradlew photon-targeting:build photon-lib:build -i | |
- run: ./gradlew photon-lib:publish photon-targeting:publish | |
name: Publish | |
env: | |
ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} | |
if: github.event_name == 'push' && github.repository_owner == 'photonvision' | |
# Copy artifacts to build/outputs/maven | |
- run: ./gradlew photon-lib:publish photon-targeting:publish -PcopyOfflineArtifacts | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: maven-${{ matrix.artifact-name }} | |
path: build/outputs | |
build-photonlib-docker: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- container: wpilib/roborio-cross-ubuntu:2024-22.04 | |
artifact-name: Athena | |
build-options: "-Ponlylinuxathena" | |
- container: wpilib/raspbian-cross-ubuntu:bullseye-22.04 | |
artifact-name: Raspbian | |
build-options: "-Ponlylinuxarm32" | |
- container: wpilib/aarch64-cross-ubuntu:bullseye-22.04 | |
artifact-name: Aarch64 | |
build-options: "-Ponlylinuxarm64" | |
runs-on: ubuntu-22.04 | |
container: ${{ matrix.container }} | |
name: "Photonlib - Build Docker - ${{ matrix.artifact-name }}" | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Config Git | |
run: | | |
git config --global --add safe.directory /__w/photonvision/photonvision | |
- name: Build PhotonLib | |
# We don't need to run tests, since we specify only non-native platforms | |
run: | | |
chmod +x gradlew | |
./gradlew photon-targeting:build photon-lib:build ${{ matrix.build-options }} -i -x test | |
- name: Publish | |
run: | | |
chmod +x gradlew | |
./gradlew photon-lib:publish photon-targeting:publish ${{ matrix.build-options }} | |
env: | |
ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} | |
if: github.event_name == 'push' && github.repository_owner == 'photonvision' | |
# Copy artifacts to build/outputs/maven | |
- run: ./gradlew photon-lib:publish photon-targeting:publish -PcopyOfflineArtifacts ${{ matrix.build-options }} | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: maven-${{ matrix.artifact-name }} | |
path: build/outputs | |
combine: | |
name: Combine | |
needs: [build-photonlib-docker, build-photonlib-host] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- run: git fetch --tags --force | |
# download all maven-* artifacts to outputs/ | |
- uses: actions/download-artifact@v4 | |
with: | |
merge-multiple: true | |
path: output | |
pattern: maven-* | |
- run: find . | |
- run: zip -r photonlib-$(git describe --tags --match=v*).zip . | |
name: ZIP stuff up | |
working-directory: output | |
- run: ls output | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: photonlib-offline | |
path: output/*.zip | |
build-package: | |
needs: [build-client, build-gradle, build-offline-docs] | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: windows-latest | |
artifact-name: Win64 | |
architecture: x64 | |
arch-override: winx64 | |
- os: macos-latest | |
artifact-name: macOS | |
architecture: x64 | |
arch-override: macx64 | |
- os: macos-latest | |
artifact-name: macOSArm | |
architecture: x64 | |
arch-override: macarm64 | |
- os: ubuntu-latest | |
artifact-name: Linux | |
architecture: x64 | |
arch-override: linuxx64 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
architecture: x64 | |
arch-override: linuxarm64 | |
runs-on: ${{ matrix.os }} | |
name: "Build fat JAR - ${{ matrix.artifact-name }}" | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install Java 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
architecture: ${{ matrix.architecture }} | |
- run: | | |
rm -rf photon-server/src/main/resources/web/* | |
mkdir -p photon-server/src/main/resources/web/docs | |
if: ${{ (matrix.os) != 'windows-latest' }} | |
- run: | | |
del photon-server\src\main\resources\web\*.* | |
mkdir photon-server\src\main\resources\web\docs | |
if: ${{ (matrix.os) == 'windows-latest' }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: built-client | |
path: photon-server/src/main/resources/web/ | |
- uses: actions/download-artifact@v4 | |
with: | |
name: built-docs | |
path: photon-server/src/main/resources/web/docs | |
- run: | | |
chmod +x gradlew | |
./gradlew photon-server:shadowJar -PArchOverride=${{ matrix.arch-override }} | |
if: ${{ (matrix.arch-override != 'none') }} | |
- run: | | |
chmod +x gradlew | |
./gradlew photon-server:shadowJar | |
if: ${{ (matrix.arch-override == 'none') }} | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: jar-${{ matrix.artifact-name }} | |
path: photon-server/build/libs | |
run-smoketest-native: | |
needs: [build-package] | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-latest | |
artifact-name: jar-Linux | |
extraOpts: -Djdk.lang.Process.launchMechanism=vfork | |
- os: windows-latest | |
artifact-name: jar-Win64 | |
extraOpts: "" | |
- os: macos-latest | |
artifact-name: jar-macOS | |
architecture: x64 | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Install Java 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: 17 | |
distribution: temurin | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ matrix.artifact-name }} | |
# On linux, install mrcal packages | |
- run: | | |
sudo apt-get update | |
sudo apt-get install --yes libcholmod3 liblapack3 libsuitesparseconfig5 | |
if: ${{ (matrix.os) == 'ubuntu-latest' }} | |
# and actually run the jar | |
- run: java -jar ${{ matrix.extraOpts }} *.jar --smoketest | |
if: ${{ (matrix.os) != 'windows-latest' }} | |
- run: ls *.jar | %{ Write-Host "Running $($_.Name)"; Start-Process "java" -ArgumentList "-jar `"$($_.FullName)`" --smoketest" -NoNewWindow -Wait; break } | |
if: ${{ (matrix.os) == 'windows-latest' }} | |
run-smoketest-chroot: | |
needs: [build-package] | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: RaspberryPi | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-4/photonvision_raspi.img.xz | |
cpu: cortex-a7 | |
image_additional_mb: 0 | |
extraOpts: -Djdk.lang.Process.launchMechanism=vfork | |
runs-on: ${{ matrix.os }} | |
name: smoketest-${{ matrix.image_suffix }} | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: jar-${{ matrix.artifact-name }} | |
- uses: pguyot/arm-runner-action@v2 | |
name: Run photon smoketest | |
id: generate_image | |
with: | |
base_image: ${{ matrix.image_url }} | |
image_additional_mb: ${{ matrix.image_additional_mb }} | |
optimize_image: yes | |
cpu: ${{ matrix.cpu }} | |
# We do _not_ wanna copy photon into the image. Bind mount instead | |
bind_mount_repository: true | |
# our image better have java installed already | |
commands: | | |
java -jar ${{ matrix.extraOpts }} *.jar --smoketest | |
build-image: | |
needs: [build-package] | |
if: ${{ github.event_name != 'pull_request' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: RaspberryPi | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-4/photonvision_raspi.img.xz | |
cpu: cortex-a7 | |
image_additional_mb: 0 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: limelight2 | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-4/photonvision_limelight.img.xz | |
cpu: cortex-a7 | |
image_additional_mb: 0 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: limelight3 | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-4/photonvision_limelight3.img.xz | |
cpu: cortex-a7 | |
image_additional_mb: 0 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: orangepi5 | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-3/photonvision_opi5.img.xz | |
cpu: cortex-a8 | |
image_additional_mb: 1024 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: orangepi5b | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-3/photonvision_opi5b.img.xz | |
cpu: cortex-a8 | |
image_additional_mb: 1024 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: orangepi5plus | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-3/photonvision_opi5plus.img.xz | |
cpu: cortex-a8 | |
image_additional_mb: 1024 | |
- os: ubuntu-latest | |
artifact-name: LinuxArm64 | |
image_suffix: orangepi5pro | |
image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/v2025.0.0-beta-3/photonvision_opi5pro.img.xz | |
cpu: cortex-a8 | |
image_additional_mb: 1024 | |
runs-on: ${{ matrix.os }} | |
name: "Build image - ${{ matrix.image_url }}" | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: jar-${{ matrix.artifact-name }} | |
- uses: pguyot/arm-runner-action@HEAD | |
name: Generate image | |
id: generate_image | |
with: | |
base_image: ${{ matrix.image_url }} | |
image_additional_mb: ${{ matrix.image_additional_mb }} | |
optimize_image: yes | |
cpu: ${{ matrix.cpu }} | |
# We do _not_ wanna copy photon into the image. Bind mount instead | |
bind_mount_repository: true | |
commands: | | |
chmod +x scripts/armrunner.sh | |
./scripts/armrunner.sh | |
- name: Compress image | |
run: | | |
new_jar=$(realpath $(find . -name photonvision\*-linuxarm64.jar)) | |
new_image_name=$(basename "${new_jar/.jar/_${{ matrix.image_suffix }}.img}") | |
mv ${{ steps.generate_image.outputs.image }} $new_image_name | |
sudo xz -T 0 -v $new_image_name | |
- uses: actions/upload-artifact@v4 | |
name: Upload image | |
with: | |
name: image-${{ matrix.image_suffix }} | |
path: photonvision*.xz | |
release: | |
needs: [build-package, build-image, combine] | |
runs-on: ubuntu-22.04 | |
steps: | |
# Download all fat JARs | |
- uses: actions/download-artifact@v4 | |
with: | |
merge-multiple: true | |
pattern: jar-* | |
# Download offline photonlib | |
- uses: actions/download-artifact@v4 | |
with: | |
merge-multiple: true | |
pattern: photonlib-offline | |
# Download all images | |
- uses: actions/download-artifact@v4 | |
with: | |
merge-multiple: true | |
pattern: image-* | |
- run: find | |
# Push to dev release | |
- uses: pyTooling/Actions/releaser@r0 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
tag: 'Dev' | |
rm: true | |
files: | | |
**/*.xz | |
**/*.jar | |
**/photonlib*.json | |
**/photonlib*.zip | |
if: github.event_name == 'push' | |
# Upload all jars and xz archives | |
- uses: softprops/action-gh-release@v1 | |
with: | |
files: | | |
**/*.xz | |
**/*.jar | |
**/photonlib*.json | |
**/photonlib*.zip | |
if: startsWith(github.ref, 'refs/tags/v') | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |