Fix Docker building (and also build for forks) #9667
Workflow file for this run
This file contains hidden or 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: Source Code Tests | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - main-release | |
| pull_request: | |
| merge_group: | |
| workflow_dispatch: | |
| env: | |
| AstrophysicsDataSystemAPIKey: ${{ secrets.AstrophysicsDataSystemAPIKey_FOR_TESTS }} | |
| BiodiversityHeritageApiKey: ${{ secrets.BiodiversityHeritageApiKey_FOR_TESTS}} | |
| IEEEAPIKey: ${{ secrets.IEEEAPIKey_FOR_TESTS }} | |
| MedlineAPiKey: ${{ secrets.MedlineApiKey_FOR_TESTS }} | |
| OpenAlexApiKey: ${{ secrets.OpenAlexApiKey_FOR_TESTS }} | |
| SpringerNatureAPIKey: ${{ secrets.SPRINGERNATUREAPIKEY_FOR_TESTS }} | |
| GRADLE_OPTS: -Xmx4g | |
| JAVA_OPTS: -Xmx4g | |
| concurrency: | |
| group: "${{ github.workflow }}-${{ github.head_ref || github.ref }}" | |
| cancel-in-progress: true | |
| permissions: | |
| # required for publish.yml | |
| actions: write | |
| contents: read | |
| pull-requests: write | |
| jobs: | |
| upload-pr-number: | |
| if: github.event_name == 'pull_request' | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Create pr_number.txt | |
| run: echo "${{ github.event.number }}" > pr_number.txt | |
| - uses: actions/upload-artifact@v7 | |
| with: | |
| name: pr_number | |
| path: pr_number.txt | |
| checkstyle: | |
| name: Checkstyle | |
| # too slow on ubuntu-slim | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run checkstyle using gradle | |
| run: gradle checkstyleMain checkstyleTest checkstyleJmh | |
| dependencyscopes: | |
| name: Dependency Scopes | |
| # too slow on ubuntu-slim | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run checkAllModuleInfo using gradle | |
| run: gradle checkAllModuleInfo | |
| openrewrite: | |
| name: OpenRewrite | |
| # too slow on ubuntu-slim | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run OpenRewrite | |
| run: | | |
| gradle --no-configuration-cache :rewriteRun | |
| - name: Output diff | |
| if: failure() | |
| run: | | |
| cat /home/runner/work/jabref/jabref/build/reports/rewrite/rewrite.patch | |
| format: | |
| # ubuntu-slim doesn't offer docker | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - uses: leventeBajczi/intellij-idea-format@master | |
| with: | |
| file-mask: "*.java" | |
| settings-file: ".idea/codeStyles/Project.xml" | |
| - name: Undo JBang changes # IntelliJ issue: https://youtrack.jetbrains.com/issue/IDEA-https://youtrack.jetbrains.com/issue/IDEA-384956/Skip-formatting-of-shebang-headers/Skip-formatting-of-shebang-headers | |
| run: git checkout HEAD -- jablib-examples/jbang/*.java | |
| # job should fail in case there are changes | |
| - name: Check if any files changed | |
| run: git diff --exit-code | |
| format-javadoc: | |
| # too slow on ubuntu-slim | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| path: 'jabref' | |
| - uses: actions/checkout@v6 | |
| with: | |
| repository: 'rmuller/Convert2MarkdownJavadoc' | |
| path: 'Convert2MarkdownJavadoc' | |
| - name: Setup JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: '24' | |
| distribution: 'corretto' | |
| check-latest: true | |
| - run: | | |
| cd Convert2MarkdownJavadoc | |
| java Convert2MarkdownJavadoc.java ../jabref | |
| - name: Check if any files changed | |
| run: | | |
| cd jabref | |
| git diff --exit-code | |
| modernizer: | |
| name: Modernizer | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run modernizer | |
| run: | | |
| # enable failing of this task if modernizer complains | |
| # sed -i "s/failOnViolations = false/failOnViolations = true/" build.gradle.kts | |
| gradle modernizer | |
| markdown: | |
| name: Markdown | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'false' | |
| show-progress: 'false' | |
| - name: markdownlint-cli2-action | |
| uses: DavidAnson/markdownlint-cli2-action@v22 | |
| with: | |
| globs: | | |
| *.md | |
| docs/**/*.md | |
| changelog: | |
| name: CHANGELOG.md | |
| # JBang needs a JDK | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'false' | |
| show-progress: 'false' | |
| - name: Generate JBang cache key | |
| id: cache-key | |
| shell: bash | |
| run: | | |
| echo "cache_key=jbang-heylogs-$(date +%F)" >> $GITHUB_OUTPUT | |
| - name: Use cache | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: ~/.jbang | |
| key: ${{ steps.cache-key.outputs.cache_key }} | |
| restore-keys: | |
| jbang-heylogs- | |
| - name: Setup JBang | |
| uses: jbangdev/setup-jbang@main | |
| - name: Lint CHANGELOG.md | |
| run: | | |
| # run heylogs verification | |
| jbang com.github.nbbrd.heylogs:heylogs-cli:0.14.1:bin check CHANGELOG.md | tee heylogs.txt || true | |
| # We have two acceptable errors | |
| if ! grep -q "3 problems" heylogs.txt; then | |
| { | |
| echo "heylogs<<EOF" | |
| cat heylogs.txt | |
| echo "EOF" | |
| } >> "$GITHUB_OUTPUT" | |
| exit 1 | |
| fi | |
| changelog-unreleased-only: | |
| if: github.event_name == 'pull_request' | |
| name: CHANGELOG.md - only unreleased touched | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'false' | |
| show-progress: 'false' | |
| fetch-depth: 0 | |
| - name: Cache clparse jar | |
| id: cache-clparse | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: /tmp/clparse | |
| key: clparse-0.9.1 | |
| - name: unzip | |
| if: steps.cache-clparse.outputs.cache-hit != 'true' | |
| run: | | |
| cd /tmp | |
| curl -LO https://github.com/marcaddeo/clparse/releases/download/0.9.1/clparse-0.9.1-x86_64-unknown-linux-musl.tar.gz | |
| tar xzvf clparse-0.9.1-x86_64-unknown-linux-musl.tar.gz | |
| - name: Install clparse | |
| run: sudo mv /tmp/clparse /usr/local/bin/clparse | |
| - uses: awalsh128/cache-apt-pkgs-action@latest | |
| with: | |
| packages: jq | |
| version: 1.0 | |
| - name: Check CHANGELOG.md diff | |
| run: | | |
| diff \ | |
| <(git show origin/main:CHANGELOG.md | clparse --format=json --separator=– - | jq '.releases[] | select(.version != null)') \ | |
| <(git show HEAD:CHANGELOG.md | clparse --format=json --separator=– - | jq '.releases[] | select(.version != null)') | |
| javadoc: | |
| name: JavaDoc | |
| # Sometimes takes longer than 15 minutes, therefore not ubuntu-slim | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - run: gradle javadoc | |
| tests: | |
| name: "Unit tests – ${{ matrix.module }}" | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| module: [ jablib, jabkit, jabsrv, jabgui ] | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run ${{ matrix.module }} tests | |
| run: xvfb-run --auto-servernum gradle :${{ matrix.module }}:check -x checkstyleJmh -x checkstyleMain -x checkstyleTest -x modernizer | |
| env: | |
| CI: "true" | |
| - name: Prepare format failed test results | |
| if: failure() | |
| uses: awalsh128/cache-apt-pkgs-action@latest | |
| with: | |
| packages: xml-twig-tools xsltproc | |
| version: 1.0 | |
| - name: Format failed test results | |
| if: failure() | |
| run: scripts/after-failure.sh | |
| tests-windows: | |
| name: "Unit tests (Windows)" | |
| if: > | |
| github.repository_owner == 'JabRef' && | |
| ( | |
| github.event_name == 'push' || | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'pull_request' && startsWith(github.event.pull_request.title, 'Update Gradle Wrapper')) | |
| ) | |
| runs-on: windows-latest | |
| strategy: | |
| matrix: | |
| module: [ jablib ] | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run ${{ matrix.module }} tests | |
| run: gradle :${{ matrix.module }}:check -x checkstyleJmh -x checkstyleMain -x checkstyleTest -x modernizer | |
| env: | |
| CI: "true" | |
| tests-windows-file-based: | |
| name: "Unit tests (Windows) - file-based" | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - name: Detect changed windows-related classes | |
| id: changed-windows-related-files | |
| uses: tj-actions/changed-files@v47 | |
| with: | |
| files: | | |
| jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleUtils.java | |
| jablib/src/test/java/org/jabref/logic/citationstyle/CSLStyleUtilsTest.java | |
| jablib/src/main/java/org/jabref/logic/exporter/AcademicPagesExporter.java | |
| jablib/src/test/java/org/jabref/logic/exporter/AcademicPagesExporterTest.java | |
| - uses: ./.github/actions/setup-gradle | |
| if: steps.changed-windows-related-files.outputs.any_changed == 'true' | |
| - name: Run jablib tests | |
| if: steps.changed-windows-related-files.outputs.any_changed == 'true' | |
| run: gradle :jablib:check -x checkstyleJmh -x checkstyleMain -x checkstyleTest -x modernizer | |
| env: | |
| CI: "true" | |
| tests-jabkit-smoke: | |
| name: "JabKit Smoke Test" | |
| runs-on: ubuntu-slim | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - run: gradle :jabkit:runJabKitPortableSmokeTest | |
| databasetests: | |
| if: (github.repository_owner == 'JabRef') | |
| name: Database tests | |
| runs-on: ubuntu-latest | |
| services: | |
| postgres: | |
| image: postgres:13-alpine | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_DB: postgres | |
| ports: | |
| - 5432:5432 | |
| # needed because the postgres container does not provide a healthcheck | |
| options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 | |
| steps: | |
| - name: Shutdown Ubuntu MySQL | |
| run: sudo service mysql stop # Shutdown the Default MySQL to save memory, "sudo" is necessary, please do not remove it | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Run tests on PostgreSQL | |
| run: gradle :jablib:databaseTest --rerun-tasks | |
| env: | |
| CI: "true" | |
| DBMS: "postgresql" | |
| publish: | |
| if: github.ref == 'refs/heads/main' | |
| uses: ./.github/workflows/publish.yml | |
| secrets: | |
| KOPPOR_SIGNING_SECRETKEYRINGFILE_BASE64: ${{ secrets.KOPPOR_SIGNING_SECRETKEYRINGFILE_BASE64 }} | |
| KOPPOR_SIGNING_KEYID: ${{ secrets.KOPPOR_SIGNING_KEYID }} | |
| KOPPOR_SIGNING_PASSWORD: ${{ secrets.KOPPOR_SIGNING_PASSWORD }} | |
| KOPPOR_MAVENCENTRALUSERNAME: ${{ secrets.KOPPOR_MAVENCENTRALUSERNAME }} | |
| KOPPOR_MAVENCENTRALPASSWORD: ${{ secrets.KOPPOR_MAVENCENTRALPASSWORD }} | |
| jbang-main: | |
| name: JBang (main) | |
| runs-on: ubuntu-slim | |
| needs: publish | |
| if: github.ref == 'refs/heads/main' | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| submodules: 'false' | |
| show-progress: 'false' | |
| - name: Detect changed jablib classes | |
| id: changed-jablib-files | |
| uses: tj-actions/changed-files@v47 | |
| with: | |
| files: | | |
| .jbang/*.java | |
| jablib/src/main/java/**/*.java | |
| jablib-examples/jbang/**/*.java | |
| files_ignore: | | |
| jablib/src/main/java/**/*-*.java | |
| - uses: ./.github/actions/setup-gradle | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| - name: Setup JDK | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: '25' | |
| distribution: 'corretto' | |
| check-latest: true | |
| # Build all JBang scripts | |
| - run: | | |
| for f in .jbang/*.java; do | |
| echo "Building $f..." | |
| jbang build --fresh "$f" | |
| done | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| - run: | | |
| for f in jablib-examples/jbang/*.java; do | |
| echo "Building $f..." | |
| jbang build --fresh "$f" | |
| done | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| # *Launcher.java should support "--help" | |
| - run: jbang run .jbang/JabKitLauncher.java --help | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| - run: jbang run .jbang/JabLsLauncher.java --help | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| - run: jbang run .jbang/JabSrvLauncher.java --help | |
| if: steps.changed-jablib-files.outputs.any_changed != 'true' | |
| jbang-pr: | |
| name: JBang (PR) | |
| runs-on: ubuntu-slim | |
| # does not need publish, because the JBang scripts are modified | |
| if: github.ref != 'refs/heads/main' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| script: [ .jbang/JabKitLauncher.java, .jbang/JabLsLauncher.java, .jbang/JabSrvLauncher.java, jablib-examples/jbang/doi_to_bibtex.java, jablib-examples/jbang/ieee_pdf_references_to_bibtex.java ] | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'false' | |
| show-progress: 'false' | |
| - name: Detect changed jablib classes | |
| id: changed-jablib-files | |
| uses: tj-actions/changed-files@v47 | |
| with: | |
| files: | | |
| .jbang/*.java | |
| jabkit/src/main/java/**/*.java | |
| jablib/src/main/java/**/*.java | |
| jablib-examples/jbang/**/*.java | |
| files_ignore: | | |
| jablib/src/main/java/**/*-*.java | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Setup JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: '25' | |
| distribution: 'corretto' | |
| check-latest: true | |
| - name: Modify ${{ matrix.script }} to include changed classes | |
| shell: bash | |
| # We always run, because changes in jabls, jabsrv also could cause JBang to fail | |
| run: | | |
| # We modify the JBang scripts directly to avoid issues with relative paths | |
| for f in ${{ steps.changed-jablib-files.outputs.all_changed_files }}; do | |
| case "$f" in | |
| .jbang/*) | |
| # skip scripts | |
| continue | |
| ;; | |
| jablib-examples/*) | |
| # skip scripts | |
| continue | |
| ;; | |
| jabkit/*) | |
| # only JabKit needs its modified sources if jabkit was modified | |
| if [ "${{ matrix.script }}" != ".jbang/JabKitLauncher.java" ]; then | |
| continue | |
| fi | |
| ;; | |
| esac | |
| if [[ "${{ matrix.script }}" == .jbang/* ]]; then | |
| echo "//SOURCES ../$f" >> "${{ matrix.script }}" | |
| else | |
| echo "//SOURCES ../../$f" >> "${{ matrix.script }}" | |
| fi | |
| done | |
| - run: cat ${{ matrix.script }} | |
| - run: jbang build "${{ matrix.script }}" | |
| shell: bash | |
| - run: jbang "${{ matrix.script }}" --help | |
| if: ${{ contains(matrix.script, 'Launcher.java') }} | |
| shell: bash | |
| maven-examples: | |
| name: Maven examples | |
| runs-on: ubuntu-latest | |
| needs: publish | |
| if: github.ref == 'refs/heads/main' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| project: [ jablib-examples/maven3/doi-to-bibtex ] | |
| steps: | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'false' | |
| show-progress: 'false' | |
| - name: Set up JDK | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: 25 | |
| distribution: 'corretto' | |
| cache: maven | |
| check-latest: true | |
| - run: | | |
| cd ${{ matrix.project }} | |
| mvn --batch-mode --update-snapshots verify | |
| shell: bash | |
| codecoverage: | |
| if: false | |
| name: Code coverage | |
| runs-on: ubuntu-slim | |
| services: | |
| postgres: | |
| image: postgres:10.8 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_DB: postgres | |
| ports: | |
| - 5432:5432 | |
| # needed because the postgres container does not provide a healthcheck | |
| options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 | |
| steps: | |
| - name: Check secrets presence | |
| id: checksecrets | |
| shell: bash | |
| run: | | |
| if [ "$CODECOV_TOKEN" == "" ]; then | |
| echo "secretspresent=NO" >> $GITHUB_OUTPUT | |
| echo "❌ Secret CODECOV_TOKEN not present" | |
| else | |
| echo "secretspresent=YES" >> $GITHUB_OUTPUT | |
| echo "✔️ Secret CODECOV_TOKEN present" | |
| fi | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| - name: Checkout source | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: 'true' | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - name: Update test coverage metrics | |
| if: (github.ref == 'refs/heads/main') && (steps.checksecrets.outputs.secretspresent == 'YES') | |
| run: xvfb-run --auto-servernum gradle jacocoTestReport | |
| env: | |
| CI: "true" | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| DBMS: "postgresql" | |
| - uses: codecov/codecov-action@v5 | |
| if: (github.ref == 'refs/heads/main') && (steps.checksecrets.outputs.secretspresent == 'YES') | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| - name: Upload Codacy report | |
| if: (github.ref == 'refs/heads/main') && (steps.checksecrets.outputs.secretspresent == 'YES') | |
| run: bash <(curl -Ls https://coverage.codacy.com/get.sh) | |
| env: | |
| CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} | |
| requirements_coverage: | |
| name: "Validate requirement coverage" | |
| runs-on: ubuntu-slim | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| show-progress: 'false' | |
| - uses: ./.github/actions/setup-gradle | |
| - run: gradle traceRequirements | |
| - if: always() | |
| run: cat build/reports/tracing.txt | |
| # This is https://github.com/marketplace/actions/gradle-wrapper-validation | |
| # It ensures that the jar file is from gradle and not by a strange third party. | |
| gradlevalidation: | |
| name: "Validate Gradle Wrapper" | |
| runs-on: ubuntu-slim | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| show-progress: 'false' | |
| - uses: gradle/actions/wrapper-validation@v5 |