# 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-latest 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-all: # The type of runner that the job will run on. runs-on: ubuntu-latest steps: # Checkout code. - name: Checkout code uses: actions/checkout@v3 # Fetch tags. - name: Fetch tags run: git fetch --tags --force # Install Java 11. - name: Install Java 11 uses: actions/setup-java@v3 with: java-version: 11 distribution: temurin # Run Gradle build. - name: Gradle Build run: | chmod +x gradlew ./gradlew build -x check --max-workers 1 # Run Gradle Tests. - name: Gradle Tests run: ./gradlew testHeadless -i --max-workers 1 # 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-latest 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.6' - 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-latest steps: # Checkout code. - uses: actions/checkout@v3 # Install Java 11. - uses: actions/setup-java@v3 with: java-version: 11 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-latest artifact-name: Win64 - os: macos-latest artifact-name: macOS - os: ubuntu-latest artifact-name: Linux runs-on: ${{ matrix.os }} name: "Photonlib - Build - ${{ matrix.artifact-name }}" steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-java@v3 with: java-version: 11 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:2022-18.04 artifact-name: Athena - container: wpilib/raspbian-cross-ubuntu:10-18.04 artifact-name: Raspbian - container: wpilib/aarch64-cross-ubuntu:bionic-18.04 artifact-name: Aarch64 runs-on: ubuntu-latest container: ${{ matrix.container }} name: "Photonlib - Build - ${{ matrix.artifact-name }}" steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - uses: actions/setup-java@v3 with: java-version: 11 distribution: temurin - run: | chmod +x gradlew ./gradlew photon-lib:build --max-workers 1 - 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-latest 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, photonlib-build-host, photonlib-build-docker] # The type of runner that the job will run on. runs-on: ubuntu-latest steps: # Checkout code. - uses: actions/checkout@v3 # Install Java 11. - uses: actions/setup-java@v3 with: java-version: 11 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 # 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 1 ./gradlew photon-server:shadowJar --max-workers 1 -Ppionly # The image will only pull the Pi JAR in - name: Generate image if: github.event_name != 'pull_request' run: | chmod +x scripts/generatePiImage.sh ./scripts/generatePiImage.sh # Upload final fat jar as artifact. - uses: actions/upload-artifact@v3 with: name: jar path: photon-server/build/libs - uses: actions/upload-artifact@v3 if: github.event_name != 'pull_request' with: name: image path: photonvision*.zip - uses: pyTooling/Actions/releaser@r0 with: token: ${{ secrets.GITHUB_TOKEN }} tag: 'Dev' rm: true files: | photon-server/build/libs/*.jar photonvision*.zip if: github.event_name == 'push' photon-release: if: startsWith(github.ref, 'refs/tags/v') needs: [photon-build-package] runs-on: ubuntu-latest steps: # This *should* pull in fat and pi-only jars - uses: actions/download-artifact@v2 with: name: jar # And the image we made previously - uses: actions/download-artifact@v2 with: name: image # All we've downloaded (ideally) is the fat jar, pi jar, and image. So just upload it all - uses: softprops/action-gh-release@v1 with: files: '**/*' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}