# This workflow builds the client (UI), the server, builds the JAR. name: CI # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the master branch on: push: branches: [ master ] tags: - 'v*' pull_request: branches: [ master ] jobs: # This job builds the client (web view). photonclient-build: # Let all steps run within the photon-client dir. defaults: run: working-directory: photon-client # The type of runner that the job will run on. runs-on: ubuntu-22.04 steps: # Checkout code. - uses: actions/checkout@v3 # Setup Node.js - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: 16 # Run npm - run: npm update -g npm - run: npm ci - run: npm run build --if-present # Upload client artifact. - uses: actions/upload-artifact@master with: name: built-client path: photon-client/dist/ photon-build-examples: runs-on: ubuntu-22.04 name: "Build Examples" steps: # Checkout code. - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 # Fetch tags. - name: Fetch tags run: git fetch --tags --force # Install Java 17. - name: Install Java 17 uses: actions/setup-java@v3 with: java-version: 17 distribution: temurin # Need to publish to maven local first, so that C++ sim can pick it up # Still haven't figure 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 buildAllExamples -x check --max-workers 2 - name: Build C++ examples working-directory: photonlib-cpp-examples run: | chmod +x gradlew ./gradlew copyPhotonlib -x check ./gradlew buildAllExamples -x check --max-workers 2 photon-build-all: # The type of runner that the job will run on. runs-on: ubuntu-22.04 steps: # Checkout code. - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 # Fetch tags. - name: Fetch tags run: git fetch --tags --force # Install Java 17. - name: Install Java 17 uses: actions/setup-java@v3 with: java-version: 17 distribution: temurin # Run only build tasks, no checks?? - name: Gradle Build run: | chmod +x gradlew ./gradlew photon-server:build photon-lib:build -x check --max-workers 2 # Run Gradle Tests. - name: Gradle Tests run: ./gradlew testHeadless -i --max-workers 1 --stacktrace # Generate Coverage Report. - name: Gradle Coverage run: ./gradlew jacocoTestReport --max-workers 1 # Publish Coverage Report. - name: Publish Server 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 photonserver-build-offline-docs: runs-on: ubuntu-22.04 steps: # Checkout docs. - uses: actions/checkout@v3 with: repository: 'PhotonVision/photonvision-docs.git' ref: master # Install Python. - uses: actions/setup-python@v4 with: python-version: '3.9' - name: Install dependencies run: | python -m pip install --upgrade pip pip install sphinx sphinx_rtd_theme sphinx-tabs sphinxext-opengraph doc8 pip install -r requirements.txt - name: Check the docs run: | make linkcheck make lint - name: Build the docs run: | make html # Upload docs artifact. - uses: actions/upload-artifact@master with: name: built-docs path: build/html photonserver-check-lint: # The type of runner that the job will run on. runs-on: ubuntu-22.04 steps: # Checkout code. - uses: actions/checkout@v3 with: fetch-depth: 0 # Install Java 17. - uses: actions/setup-java@v3 with: java-version: 17 distribution: temurin # Check server code with Spotless. - run: | chmod +x gradlew ./gradlew spotlessCheck # Building photonlib photonlib-build-host: env: MACOSX_DEPLOYMENT_TARGET: 10.14 strategy: fail-fast: false matrix: include: - os: windows-2022 artifact-name: Win64 - os: macos-11 artifact-name: macOS - os: ubuntu-22.04 artifact-name: Linux runs-on: ${{ matrix.os }} name: "Photonlib - Build Host - ${{ matrix.artifact-name }}" steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-java@v3 with: java-version: 17 distribution: temurin - run: git fetch --tags --force - run: | chmod +x gradlew ./gradlew photon-lib:build --max-workers 1 - run: ./gradlew photon-lib:publish photon-targeting:publish name: Publish env: ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} if: github.event_name == 'push' photonlib-build-docker: strategy: fail-fast: false matrix: include: - container: wpilib/roborio-cross-ubuntu:2023-22.04 artifact-name: Athena - container: wpilib/raspbian-cross-ubuntu:bullseye-22.04 artifact-name: Raspbian - container: wpilib/aarch64-cross-ubuntu:bullseye-22.04 artifact-name: Aarch64 runs-on: ubuntu-22.04 container: ${{ matrix.container }} name: "Photonlib - Build Docker - ${{ matrix.artifact-name }}" steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Config Git run: | git config --global --add safe.directory /__w/photonvision/photonvision - name: Build PhotonLib run: | chmod +x gradlew ./gradlew photon-lib:build --max-workers 1 - name: Publish run: | chmod +x gradlew ./gradlew photon-lib:publish env: ARTIFACTORY_API_KEY: ${{ secrets.ARTIFACTORY_API_KEY }} if: github.event_name == 'push' photonlib-wpiformat: name: "wpiformat" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - name: Fetch all history and metadata run: | git fetch --prune --unshallow git checkout -b pr git branch -f master origin/master - name: Set up Python 3.8 uses: actions/setup-python@v4 with: python-version: 3.8 - name: Install clang-format run: | sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe' >> /etc/apt/sources.list.d/proposed-repositories.list" sudo apt-get update -q sudo apt-get install -y clang-format-12 - name: Install wpiformat run: pip3 install wpiformat - name: Run run: wpiformat -clang 12 - name: Check Output run: git --no-pager diff --exit-code HEAD - name: Generate diff run: git diff HEAD > wpiformat-fixes.patch if: ${{ failure() }} - uses: actions/upload-artifact@v3 with: name: wpiformat fixes path: wpiformat-fixes.patch if: ${{ failure() }} photon-build-package: needs: [photonclient-build, photon-build-all, photonserver-build-offline-docs] strategy: fail-fast: false matrix: include: - os: windows-latest artifact-name: Win64 architecture: x64 arch-override: none - os: macos-latest artifact-name: macOS architecture: x64 arch-override: none - os: ubuntu-latest artifact-name: Linux architecture: x64 arch-override: none - os: macos-latest artifact-name: macOSArm architecture: x64 arch-override: macarm64 - os: ubuntu-latest artifact-name: LinuxArm32 architecture: x64 arch-override: linuxarm32 - os: ubuntu-latest artifact-name: LinuxArm64 architecture: x64 arch-override: linuxarm64 # The type of runner that the job will run on. runs-on: ${{ matrix.os }} name: "Build fat JAR - ${{ matrix.artifact-name }}" steps: # Checkout code. - uses: actions/checkout@v3 with: fetch-depth: 0 # Install Java 17. - uses: actions/setup-java@v3 with: java-version: 17 distribution: temurin # Clear any existing web resources. - 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' }} # Download client artifact to resources folder. - uses: actions/download-artifact@v3 with: name: built-client path: photon-server/src/main/resources/web/ # Download docs artifact to resources folder. - uses: actions/download-artifact@v3 with: name: built-docs path: photon-server/src/main/resources/web/docs # Build fat jar for both pi and everything - run: | chmod +x gradlew ./gradlew photon-server:shadowJar --max-workers 2 -PArchOverride=${{ matrix.arch-override }} if: ${{ (matrix.arch-override != 'none') }} - run: | chmod +x gradlew ./gradlew photon-server:shadowJar --max-workers 2 if: ${{ (matrix.arch-override == 'none') }} # The image will only pull the Pi32 JAR in - name: Generate image if: ${{ github.event_name != 'pull_request' && (matrix.artifact-name) == 'LinuxArm32' }} run: | chmod +x scripts/generatePiImage.sh ./scripts/generatePiImage.sh # Upload final fat jar as artifact. - uses: actions/upload-artifact@v3 with: name: jar-${{ matrix.artifact-name }} path: photon-server/build/libs # Upload image as well - uses: actions/upload-artifact@v3 if: ${{ github.event_name != 'pull_request' && (matrix.artifact-name) == 'LinuxArm32' }} with: name: image-${{ matrix.artifact-name }} path: photonvision*.xz photon-release: needs: [photon-build-package] runs-on: ubuntu-22.04 steps: # Download literally every single artifact. This also downloads client and docs, # but the filtering below won't pick these up (I hope) - uses: actions/download-artifact@v2 - run: find # Push to dev release - uses: pyTooling/Actions/releaser@r0 with: token: ${{ secrets.GITHUB_TOKEN }} tag: 'Dev' rm: true files: | **/*.xz **/*.jar if: github.event_name == 'push' # Upload all jars and xz archives - uses: softprops/action-gh-release@v1 with: files: | **/*.xz **/*.jar if: startsWith(github.ref, 'refs/tags/v') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}