name: Java CI env: junit_platform_version: '1.7.0' # ANT_HOME is also our ant version ANT_HOME: 'apache-ant-1.10.9' on: push: branches: [master] pull_request: branches: [master] defaults: run: shell: bash jobs: createrelease: name: Create Release runs-on: ubuntu-latest env: LANG: en_US.UTF-8 outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} josm_revision: ${{ steps.create_revision.outputs.josm_revision }} josm_prerelease: ${{ steps.create_revision.outputs.josm_prerelease }} josm_release_tag: ${{ steps.create_revision.outputs.josm_release_tag }} steps: - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 256 - name: Set revision env variable id: create_revision # grab josm revision from last git-svn-id run: | josm_revision="$(git log -1 --grep 'git-svn-id: https://josm.openstreetmap.de/svn/trunk@' --pretty=format:%B | tail -1 | sed -n 's%git-svn-id: https://josm.openstreetmap.de/svn/trunk@\([0-9]*\) [-0-9a-f]*%\1%p')" if [[ "$josm_revision" == "$(curl --silent https://josm.openstreetmap.de/tested)" ]]; then echo "josm_prerelease=false" >> $GITHUB_ENV echo "::set-output name=josm_prerelease::false" josm_release_tag=$josm_revision-tested else echo "josm_prerelease=true" >> $GITHUB_ENV echo "::set-output name=josm_prerelease::true" josm_release_tag=$josm_revision fi echo "josm_revision=$josm_revision" >> $GITHUB_ENV echo "::set-output name=josm_revision::$josm_revision" echo "josm_release_tag=$josm_release_tag" >> $GITHUB_ENV echo "::set-output name=josm_release_tag::$josm_release_tag" - name: Create release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: tag_name: ${{ env.josm_release_tag }} release_name: JOSM.app release ${{ env.josm_release_tag }} body: | JOSM.app release ${{ env.josm_release_tag }} draft: false prerelease: ${{ env.josm_prerelease }} build: needs: createrelease runs-on: ${{ matrix.os }} env: LANG: en_US.UTF-8 strategy: fail-fast: false matrix: # test against latest update of each major Java version, as well as specific updates of LTS versions: java: [8, 11, 15, 16-ea] os: [ubuntu-latest, macos-latest, windows-latest] headless: ["true", "false"] exclude: - java: 8 os: macos-latest - java: 11 os: macos-latest - headless: "false" os: macos-latest - headless: "false" os: windows-latest name: Java ${{ matrix.java }} on ${{ matrix.os }} with headless=${{ matrix.headless }} steps: - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 256 - name: Cache uses: actions/cache@v2.0.0 with: path: | ~/.ivy2/cache/ ~/work/josm/josm/tools/ build-tools-cache/ key: ${{ runner.os }}-ivy2-${{ hashFiles('ivy.xml') }} - name: Setup java uses: actions/setup-java@v1.4.3 with: java-version: ${{ matrix.java }} - name: Install ant ${{ env.ANT_HOME }} and junit ${{ env.junit_platform_version }} run: | mkdir -p build-tools-cache/ cd build-tools-cache/ if [ ! -f ${{ env.ANT_HOME }}-bin.tar.gz ]; then curl -o ${{ env.ANT_HOME }}-bin.tar.gz https://downloads.apache.org/ant/binaries/${{ env.ANT_HOME }}-bin.tar.gz fi if [ ! -f junit-platform-console-standalone-${{ env.junit_platform_version }}.jar ]; then curl -o junit-platform-console-standalone-${{ env.junit_platform_version }}.jar https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/${{ env.junit_platform_version }}/junit-platform-console-standalone-${{ env.junit_platform_version }}.jar fi cd .. tar zxf build-tools-cache/${{ env.ANT_HOME }}-bin.tar.gz cp build-tools-cache/junit-platform-console-standalone-${{ env.junit_platform_version }}.jar ${{ env.ANT_HOME }}/lib/junit-platform-console-standalone-${{ env.junit_platform_version }}.jar - name: Print ant version, expecting ${{ env.ANT_HOME }} run: ${{ env.ANT_HOME }}/bin/ant -version - name: Optimise images if: ${{ runner.os == 'macos' && always() }} run: | brew cask install imageoptim defaults write net.pornel.ImageOptim SvgoEnabled 1 defaults write net.pornel.ImageOptim PngCrush2Enabled 1 defaults write net.pornel.ImageOptim PngOutEnabled 1 /Applications/ImageOptim.app/Contents/MacOS/ImageOptim resources/images - name: Set Is-Local-Build if: ${{ ! needs.createrelease.outputs.josm_prerelease }} run: | ant create-revision sed -i.bak '/Is-Local-Build/d' resources/REVISION - name: Build with Ant # Disables errorprone for Java 16 # See https://github.com/google/error-prone/issues/1872 run: | if [[ "x${{ matrix.java }}x" =~ x1[6-9](-ea)?x ]]; then ${{ env.ANT_HOME }}/bin/ant -DnoErrorProne dist else ${{ env.ANT_HOME }}/bin/ant dist fi - name: Upload jar # Only run on matrix.headless to avoid double jars. They should be the same jars. # uses `gh release upload` to avoid https://github.com/actions/upload-release-asset/issues/69 if: ${{ always() && matrix.headless == 'true' }} id: upload-jar env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} uses: actions/upload-release-asset@v1 with: upload_url: ${{ needs.createrelease.outputs.upload_url }} # This pulls from the CREATE RELEASE job above, referencing its ID to get its outputs object, which include a `upload_url`. asset_path: dist/josm-custom.jar asset_name: JOSM-${{ runner.os}}-java${{ matrix.java }}-${{ needs.createrelease.outputs.josm_revision }}.jar asset_content_type: application/java-archive # run: | # cp dist/josm-custom.jar JOSM-${{ runner.os}}-java${{ matrix.java }}-${{ needs.createrelease.outputs.josm_revision }}.jar # gh release upload ${{ needs.createrelease.outputs.josm_release_tag }} JOSM-${{ runner.os}}-java${{ matrix.java }}-${{ needs.createrelease.outputs.josm_revision }}.jar - name: Test with Ant, headless ${{ matrix.headless }} if: ${{ needs.createrelease.outputs.josm_prerelease }} run: | ANT="${{ env.ANT_HOME }}/bin/ant -DnoJavaFX=true test-unit-hardfail" if [ "${{ matrix.headless }}" == "true" ]; then $ANT -Dtest.headless=true else xvfb-run $ANT -Dtest.headless=false fi - name: Dump errors if failed if: ${{ failure() }} run: "grep -L ', Failures: 0, Skipped: ' test/report/*.txt | xargs cat" - name: Upload Ant reports if: ${{ always() }} uses: actions/upload-artifact@v2 with: name: Ant reports for JOSM ${{ needs.createrelease.outputs.josm_revision }} on java ${{ matrix.java }} on ${{ matrix.os }} with headless=${{ matrix.headless }} path: test/report/*.txt - name: Publish Test Report with junit-report-annotations-action uses: ashley-taylor/junit-report-annotations-action@1.3 if: always() with: access-token: ${{ secrets.GITHUB_TOKEN }} path: 'test/report/TEST*.xml' - name: Publish Test Report with action-junit-report if: always() uses: mikepenz/action-junit-report@v1 with: report_paths: 'test/report/TEST*.xml' github_token: ${{ secrets.GITHUB_TOKEN }} - name: Build and package for macOS if: ${{ runner.os == 'macos' && always() }} env: CERT_MACOS_P12: ${{ secrets.CERT_MACOS_P12 }} CERT_MACOS_PW: ${{ secrets.CERT_MACOS_PW }} APPLE_ID_PW: ${{ secrets.APPLE_ID_PW }} run: | ./native/macosx/macos-jpackage.sh ${{ needs.createrelease.outputs.josm_revision }} - name: Upload app if: ${{ runner.os == 'macos' && always() }} id: upload-app uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.createrelease.outputs.upload_url }} # This pulls from the CREATE RELEASE job above, referencing its ID to get its outputs object, which include a `upload_url`. asset_path: app/JOSM.zip asset_name: JOSM-${{ runner.os}}-java${{ matrix.java }}.zip asset_content_type: application/zip