diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 0000000000..cc65b83095 --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,18 @@ +name: "Setup Processing" +description: "Setup the required contents for Processing to build" +inputs: + arch: + description: 'Architecture of the JDK to download' + required: false +runs: + using: "composite" + steps: + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + architecture: ${{ inputs.arch }} + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 \ No newline at end of file diff --git a/.github/workflows/build-gradle.yml b/.github/workflows/build-gradle.yml deleted file mode 100644 index 254433edd0..0000000000 --- a/.github/workflows/build-gradle.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Branch Builds -on: - push: - paths-ignore: - - '**/*.md' - - '.all-contributorsrc' - -jobs: - test: - runs-on: ubuntu-latest - name: Test Processing - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - - name: Build with Gradle - run: ./gradlew test - build: - name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Build - runs-on: ${{ matrix.os }} - needs: test - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-24.04-arm - os_prefix: linux - arch: aarch64 - binary: processing*.snap - - os: ubuntu-latest - os_prefix: linux - arch: x64 - binary: processing*.snap - - os: windows-latest - os_prefix: windows - arch: x64 - binary: msi/Processing-*.msi - - os: macos-latest - os_prefix: macos - arch: x64 - binary: dmg/Processing-*.dmg - - os: macos-latest - os_prefix: macos - arch: aarch64 - binary: dmg/Processing-*.dmg - steps: - - name: Install Snapcraft - if: runner.os == 'Linux' - uses: samuelmeuli/action-snapcraft@v3 - - name: Install LXD - if: runner.os == 'Linux' - uses: canonical/setup-lxd@main - - - name: Checkout Repository - uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - - name: Build with Gradle - run: ./gradlew packageDistributionForCurrentOS - - - name: Add artifact - uses: actions/upload-artifact@v4 - with: - name: processing-${{ matrix.os_prefix }}-${{ matrix.arch }}-br_${{ github.ref_name }} - retention-days: 1 - path: app/build/compose/binaries/main/${{ matrix.binary }} \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b1b7f9ad62..53944d10df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,77 +1,70 @@ -name: Branch Builds (Legacy) -on: +name: Branch Builds +on: push: paths-ignore: - '**/*.md' - '.all-contributorsrc' + pull_request: + paths-ignore: + - '**/*.md' + branches: + - main + jobs: test: runs-on: ubuntu-latest - name: Run Tests + name: Test Processing steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - architecture: x64 - - name: Build - run: > - cd build; - ant -noinput build test; - build: - name: Create Pre-release for ${{ matrix.os_prefix }} (${{ matrix.arch }}) - needs: test + + - name: Setup Processing + uses: ./.github/actions/setup + + - name: Build with Gradle + run: ./gradlew test + build: + name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Build runs-on: ${{ matrix.os }} - permissions: - contents: write + needs: test strategy: fail-fast: false matrix: include: - # compiling for arm32 needs a self-hosted runner on Raspi OS (32-bit) - - os: [self-hosted, linux, ARM] + - os: ubuntu-24.04-arm os_prefix: linux - arch: arm + arch: aarch64 + binary: deb/processing*.deb - os: ubuntu-latest os_prefix: linux arch: x64 + binary: deb/processing*.deb - os: windows-latest os_prefix: windows arch: x64 + binary: msi/Processing-*.msi - os: macos-latest os_prefix: macos arch: x64 + binary: dmg/Processing-*.dmg - os: macos-latest os_prefix: macos arch: aarch64 - - os: macos-latest - os_prefix: linux - arch: aarch64 + binary: dmg/Processing-*.dmg steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Checkout Examples Repository - uses: actions/checkout@v4 - with: - repository: processing/processing-examples - path: processing-examples - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Ant - uses: cedx/setup-ant@v3 - - name: Build Release - run: ant -noinput -buildfile build/build.xml ${{ matrix.os_prefix }}-dist -Dversion="${{ github.sha }}" + + - name: Setup Processing + uses: ./.github/actions/setup + + - name: Package Processing with Gradle + run: ./gradlew packageDistributionForCurrentOS + - name: Add artifact uses: actions/upload-artifact@v4 with: - name: processing-${{ github.ref_name }}-${{github.sha}}-${{ matrix.os_prefix }}-${{ matrix.arch }}-ant - path: ./build/${{ matrix.os_prefix }}/processing-${{github.sha}}-${{ matrix.os_prefix}}-* + name: processing-${{ matrix.os_prefix }}-${{ matrix.arch }}-br_${{ github.ref_name }} retention-days: 1 + path: app/build/compose/binaries/main/${{ matrix.binary }} \ No newline at end of file diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml deleted file mode 100644 index 1997a5a4e9..0000000000 --- a/.github/workflows/lock.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: 'Lock Threads' - -on: - schedule: - - cron: '0 6 * * *' - -permissions: - contents: read - -jobs: - lock: - permissions: - issues: write - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: dessant/lock-threads@v4 - with: - github-token: ${{ github.token }} - issue-lock-inactive-days: '30' - issue-lock-comment: > - This issue has been automatically locked. To avoid confusion - with reports that have already been resolved, closed issues - are automatically locked 30 days after the last comment. - Please open a new issue for related bugs. - pr-lock-comment: > - This pull request has been automatically locked. - Pull requests that have been closed are automatically - locked 30 days after the last comment. diff --git a/.github/workflows/pull_request-gradle.yml b/.github/workflows/pr.yml similarity index 67% rename from .github/workflows/pull_request-gradle.yml rename to .github/workflows/pr.yml index 4ea0bcc9db..c822c46e7d 100644 --- a/.github/workflows/pull_request-gradle.yml +++ b/.github/workflows/pr.yml @@ -13,13 +13,11 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 with: - java-version: '17' - distribution: 'temurin' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + fetch-depth: 0 + + - name: Setup Processing + uses: ./.github/actions/setup - name: Build with Gradle run: ./gradlew test @@ -34,11 +32,11 @@ jobs: - os: ubuntu-24.04-arm os_prefix: linux arch: aarch64 - binary: processing*.snap + binary: deb/processing*.deb - os: ubuntu-latest os_prefix: linux arch: x64 - binary: processing*.snap + binary: deb/processing*.deb - os: windows-latest os_prefix: windows arch: x64 @@ -52,23 +50,11 @@ jobs: arch: aarch64 binary: dmg/Processing-*.dmg steps: - - name: Install Snapcraft - if: runner.os == 'Linux' - uses: samuelmeuli/action-snapcraft@v3 - - name: Install LXD - if: runner.os == 'Linux' - uses: canonical/setup-lxd@main - - name: Checkout Repository uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + + - name: Setup Processing + uses: ./.github/actions/setup - name: Build with Gradle run: ./gradlew packageDistributionForCurrentOS diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml deleted file mode 100644 index 5831a166a4..0000000000 --- a/.github/workflows/pull_request.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Pull Requests (Legacy) -on: - pull_request: - paths-ignore: - - '**/*.md' - branches: - - main - -jobs: - build: - name: Create Pull Request Build for ${{ matrix.os_prefix }} (${{ matrix.arch }}) - runs-on: ${{ matrix.os }} - permissions: - pull-requests: write - contents: read - strategy: - fail-fast: false - matrix: - include: - # compiling for arm32 needs a self-hosted runner on Raspi OS (32-bit) - - os: [self-hosted, linux, ARM] - os_prefix: linux - arch: arm - - os: ubuntu-latest - os_prefix: linux - arch: x64 - - os: windows-latest - os_prefix: windows - arch: x64 - - os: macos-latest - os_prefix: macos - arch: x64 - - os: macos-latest - os_prefix: macos - arch: aarch64 - - os: macos-latest - os_prefix: linux - arch: aarch64 - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - name: Checkout Examples Repository - uses: actions/checkout@v4 - with: - repository: processing/processing-examples - path: processing-examples - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Ant - uses: cedx/setup-ant@v3 - - name: Build Release - run: ant -noinput -buildfile build/build.xml ${{ matrix.os_prefix }}-dist -Dversion="${{ github.sha }}" -Dplatform=${{ matrix.os_prefix }} - - name: Add artifact - uses: actions/upload-artifact@v4 - id: upload - with: - name: processing-pr${{ github.event.pull_request.number }}-${{github.sha}}-${{ matrix.os_prefix }}-${{ matrix.arch }}-ant - path: ./build/${{ matrix.os_prefix }}/processing-${{github.sha}}-${{ matrix.os_prefix}}-* - retention-days: 5 diff --git a/.github/workflows/release-gradle.yml b/.github/workflows/release-gradle.yml deleted file mode 100644 index 16e8984e3b..0000000000 --- a/.github/workflows/release-gradle.yml +++ /dev/null @@ -1,193 +0,0 @@ -name: Releases -on: - release: - types: [published] - -jobs: - version: - runs-on: ubuntu-latest - outputs: - revision: ${{ steps.tag_info.outputs.revision }} - version: ${{ steps.tag_info.outputs.version }} - steps: - - name: Extract version and revision - id: tag_info - shell: bash - run: | - TAG_NAME="${GITHUB_REF#refs/tags/}" - REVISION=$(echo "$TAG_NAME" | cut -d'-' -f2) - VERSION=$(echo "$TAG_NAME" | cut -d'-' -f3) - - # Set outputs for use in later jobs or steps - echo "revision=$REVISION" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - reference: - name: Publish Processing Reference to release - runs-on: ubuntu-latest - permissions: - contents: write - needs: version - steps: - - name: Checkout Website Repository - uses: actions/checkout@v4 - with: - repository: processing/processing-website - - name: Use Node.js 16 - uses: actions/setup-node@v3 - with: - node-version: 16 - - name: Install dependencies - run: npm ci - - name: Build - run: npm run build - - name: Make reference.zip - run: npm run zip - - name: Upload reference to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - asset_name: processing-${{ needs.version.outputs.version }}-reference.zip - file: reference.zip - - publish: - name: Publish Processing Libraries to Maven Central - runs-on: ubuntu-latest - needs: version - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - name: Setup Java - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: 17 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - - name: Build with Gradle - run: ./gradlew publish - env: - MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} - MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} - - ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} - ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} - - ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_IN_MEMORY_KEY }} - ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_IN_MEMORY_KEY_PASSWORD }} - - ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} - ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} - build: - name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Release - runs-on: ${{ matrix.os }} - needs: version - permissions: - contents: write - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-24.04-arm - os_prefix: linux - arch: aarch64 - binary: ${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_arm64 - extension: snap - - os: ubuntu-latest - os_prefix: linux - arch: x64 - binary: ${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_amd64 - extension: snap - - os: windows-latest - os_prefix: windows - arch: x64 - binary: msi/Processing-${{ needs.version.outputs.version }} - extension: msi - - os: macos-latest - os_prefix: macos - arch: x64 - binary: dmg/Processing-${{ needs.version.outputs.version }} - extension: dmg - - os: macos-latest - os_prefix: macos - arch: aarch64 - binary: dmg/Processing-${{ needs.version.outputs.version }} - extension: dmg - steps: - - name: Install Certificates for Code Signing - if: runner.os == 'macOS' - continue-on-error: true - uses: apple-actions/import-codesign-certs@v3 - with: - p12-file-base64: ${{ secrets.CERTIFICATES_P12 }} - p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - - name: Install Snapcraft - if: runner.os == 'Linux' - uses: samuelmeuli/action-snapcraft@v3 - - name: Install LXD - if: runner.os == 'Linux' - uses: canonical/setup-lxd@main - - - name: Checkout Repository - uses: actions/checkout@v4 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: '17.0.8' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - - name: Build with Gradle - run: ./gradlew packageDistributionForCurrentOS - env: - ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} - ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} - ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} - ORG_GRADLE_PROJECT_compose.desktop.verbose: true - ORG_GRADLE_PROJECT_compose.desktop.mac.sign: ${{ secrets.PROCESSING_SIGNING }} - ORG_GRADLE_PROJECT_compose.desktop.mac.signing.identity: ${{ secrets.PROCESSING_SIGNING_IDENTITY }} - ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.appleID: ${{ secrets.PROCESSING_APPLE_ID }} - ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.password: ${{ secrets.PROCESSING_APP_PASSWORD }} - ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.teamID: ${{ secrets.PROCESSING_TEAM_ID }} - ORG_GRADLE_PROJECT_snapname: ${{ vars.SNAP_NAME }} - - - name: Sign files with Trusted Signing - if: runner.os == 'Windows' - uses: azure/trusted-signing-action@v0 - with: - azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} - azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} - azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} - endpoint: https://eus.codesigning.azure.net/ - trusted-signing-account-name: ${{ secrets.AZURE_SIGNING_ACCOUNT_NAME }} - certificate-profile-name: ${{ secrets.AZURE_CERTIFICATE_PROFILE_NAME }} - files-folder: app/build/compose/binaries/main/msi - files-folder-filter: msi - file-digest: SHA256 - timestamp-rfc3161: http://timestamp.acs.microsoft.com - timestamp-digest: SHA256 - - - name: Upload portables to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - asset_name: processing-${{ needs.version.outputs.version }}-${{ matrix.os_prefix }}-${{ matrix.arch }}-portable.zip - file: app/build/compose/binaries/main/Processing-${{ needs.version.outputs.version }}.zip - - - name: Upload installers to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - asset_name: processing-${{ needs.version.outputs.version }}-${{ matrix.os_prefix }}-${{ matrix.arch }}.${{ matrix.extension }} - file: app/build/compose/binaries/main/${{ matrix.binary }}.${{ matrix.extension }} - - - name: Upload snap to Snap Store - if: runner.os == 'Linux' - run: snapcraft upload --release=beta app/build/compose/binaries/main/${{ matrix.binary }}.${{ matrix.extension }} - env: - SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.PROCESSING_SNAPCRAFT_TOKEN }} - - \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf4d33cd89..e8de46389b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Releases (Legacy) +name: Releases on: release: types: [published] @@ -7,34 +7,59 @@ jobs: version: runs-on: ubuntu-latest outputs: - build_number: ${{ steps.tag_info.outputs.build_number }} + revision: ${{ steps.tag_info.outputs.revision }} version: ${{ steps.tag_info.outputs.version }} steps: - - name: Extract version and build number + - name: Extract version and revision id: tag_info shell: bash run: | TAG_NAME="${GITHUB_REF#refs/tags/}" - BUILD_NUMBER=$(echo "$TAG_NAME" | cut -d'-' -f2) + REVISION=$(echo "$TAG_NAME" | cut -d'-' -f2) VERSION=$(echo "$TAG_NAME" | cut -d'-' -f3) # Set outputs for use in later jobs or steps - echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT + echo "revision=$REVISION" >> $GITHUB_OUTPUT echo "version=$VERSION" >> $GITHUB_OUTPUT - publish: - name: Publish Processing Core to Maven Central + reference: + name: Publish Processing Reference to release runs-on: ubuntu-latest + permissions: + contents: write needs: version steps: - - name: Checkout Repository + - name: Checkout Website Repository uses: actions/checkout@v4 - - name: Setup Java - uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: 17 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + repository: processing/processing-website + - name: Use Node.js 16 + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build + - name: Make reference.zip + run: npm run zip + - name: Upload reference to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-reference.zip + file: reference.zip + + publish-maven: + name: Publish Processing Libraries to Maven Central + runs-on: ubuntu-latest + needs: version + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Processing + uses: ./.github/actions/setup + - name: Build with Gradle run: ./gradlew publish env: @@ -48,8 +73,9 @@ jobs: ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_IN_MEMORY_KEY_PASSWORD }} ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} - build: - name: Publish Release for ${{ matrix.os_prefix }} (${{ matrix.arch }}) + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + release-windows: + name: (windows/${{ matrix.arch }}) Create Processing Release runs-on: ${{ matrix.os }} needs: version permissions: @@ -58,61 +84,263 @@ jobs: fail-fast: false matrix: include: - # compiling for arm32 needs a self-hosted runner on Raspi OS (32-bit) - - os: [self-hosted, linux, ARM] - os_prefix: linux - arch: arm - - os: ubuntu-latest - os_prefix: linux - arch: x64 - - os: windows-latest - os_prefix: windows - arch: x64 - - os: macos-latest - os_prefix: macos - arch: x64 - - os: macos-latest - os_prefix: macos - arch: aarch64 - - os: macos-latest - os_prefix: linux - arch: aarch64 + - arch: x64 + os: windows-latest +# - arch: aarch64 +# os: windows-11-arm steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Checkout Examples Repository - uses: actions/checkout@v4 + + - name: Setup Processing + uses: ./.github/actions/setup + + - name: Build with Gradle + run: ./gradlew packageDistributionForCurrentOS + env: + ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} + + - name: Sign files with Trusted Signing + uses: azure/trusted-signing-action@v0 + with: + azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} + azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} + azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} + endpoint: https://eus.codesigning.azure.net/ + trusted-signing-account-name: ${{ secrets.AZURE_SIGNING_ACCOUNT_NAME }} + certificate-profile-name: ${{ secrets.AZURE_CERTIFICATE_PROFILE_NAME }} + files-folder: app/build/compose/binaries/main/msi + files-folder-filter: msi + file-digest: SHA256 + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 + + - name: Upload portable version + uses: svenstaro/upload-release-action@v2 with: - repository: processing/processing-examples - path: processing-examples - - name: Install Java - uses: actions/setup-java@v4 + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-windows-${{ matrix.arch }}-portable.zip + file: app/build/compose/binaries/main/Processing-${{ needs.version.outputs.version }}.zip + + - name: Upload installer + uses: svenstaro/upload-release-action@v2 with: - java-version: '17' - distribution: 'temurin' - architecture: ${{ matrix.arch }} - - name: Setup Ant - uses: cedx/setup-ant@v3 - - name: Write build_number and revision to todo.txt and Base.java - run: | - echo "${{ needs.version.outputs.build_number }} (${{ needs.version.outputs.version }})" > todo.txt - perl -pi -e 's/static private final int REVISION = \d+;/static private final int REVISION = ${{ needs.version.outputs.build_number }};/g; s/static private String VERSION_NAME = "\d+";\s*\/\/\$NON-NLS-1\$/static private String VERSION_NAME = "${{ needs.version.outputs.build_number }}"; \/\/\$NON-NLS-1\$/g' app/src/processing/app/Base.java + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-windows-${{ matrix.arch }}.msi + file: app/build/compose/binaries/main/msi/Processing-${{ needs.version.outputs.version }}.msi + + release-macos: + name: (macOS/${{ matrix.arch }}) Create Processing Release + runs-on: macos-latest + needs: version + permissions: + contents: write + strategy: + fail-fast: false + matrix: + include: + - arch: x64 + - arch: aarch64 + steps: - name: Install Certificates for Code Signing - if: ${{ matrix.os_prefix == 'macos' }} + continue-on-error: true uses: apple-actions/import-codesign-certs@v3 - with: + with: p12-file-base64: ${{ secrets.CERTIFICATES_P12 }} p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }} - - name: Build Release - run: ant -noinput -buildfile build/build.xml ${{ matrix.os_prefix }}-dist -Dversion="${{ needs.version.outputs.version }}" -Dplatform=${{ matrix.os_prefix }} + + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Processing + uses: ./.github/actions/setup + with: + arch: ${{ matrix.arch }} + + - name: Build with Gradle + run: ./gradlew packageDistributionForCurrentOS env: - PROCESSING_APP_SIGNING: true - PROCESSING_APP_PASSWORD: ${{ secrets.PROCESSING_APP_PASSWORD }} - PROCESSING_APPLE_ID: ${{ secrets.PROCESSING_APPLE_ID }} - PROCESSING_TEAM_ID: ${{ secrets.PROCESSING_TEAM_ID }} - - name: Upload binaries to release + ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} + ORG_GRADLE_PROJECT_compose.desktop.verbose: true + ORG_GRADLE_PROJECT_compose.desktop.mac.sign: ${{ secrets.PROCESSING_SIGNING }} + ORG_GRADLE_PROJECT_compose.desktop.mac.signing.identity: ${{ secrets.PROCESSING_SIGNING_IDENTITY }} + ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.appleID: ${{ secrets.PROCESSING_APPLE_ID }} + ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.password: ${{ secrets.PROCESSING_APP_PASSWORD }} + ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.teamID: ${{ secrets.PROCESSING_TEAM_ID }} + + - name: Upload portables to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-macos-${{ matrix.arch }}-portable.zip + file: app/build/compose/binaries/main/Processing-${{ needs.version.outputs.version }}.zip + + - name: Upload installers to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-macos-${{ matrix.arch }}.dmg + file: app/build/compose/binaries/main/dmg/Processing-${{ needs.version.outputs.version }}.dmg + + release-linux: + name: (linux/${{ matrix.arch }}) Create Processing Release + runs-on: ${{ matrix.os }} + needs: version + permissions: + contents: write + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-24.04-arm + arch: aarch64 + deb: arm64 + - os: ubuntu-latest + arch: x64 + deb: amd64 + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Processing + uses: ./.github/actions/setup + + - name: Build with Gradle + run: ./gradlew packageDistributionForCurrentOS + env: + ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} + ORG_GRADLE_PROJECT_compose.desktop.verbose: true + + - name: Upload portable to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}-portable.zip + file: app/build/compose/binaries/main/Processing-${{ needs.version.outputs.version }}.zip + + - name: Upload installer to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.deb + file: app/build/compose/binaries/main/deb/processing_${{ needs.version.outputs.version }}-1_${{ matrix.deb }}.deb + + - name: Add artifact + uses: actions/upload-artifact@v4 + with: + name: processing_${{ needs.version.outputs.version }}-1_${{ matrix.deb }}.deb + retention-days: 1 + path: app/build/compose/binaries/main/deb/processing_${{ needs.version.outputs.version }}-1_${{ matrix.deb }}.deb + + release-linux-snap: + name: (linux/${{ matrix.arch }}) Create Processing Snap Release + runs-on: ${{ matrix.os }} + needs: [version, release-linux] + permissions: + contents: write + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-24.04-arm + arch: aarch64 + deb: arm64 + - os: ubuntu-latest + arch: x64 + deb: amd64 + steps: + - name: Install Snapcraft + uses: samuelmeuli/action-snapcraft@v3 + + - name: Install LXD + uses: canonical/setup-lxd@main + + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: processing_${{ needs.version.outputs.version }}-1_${{ matrix.deb }}.deb + path: app/build/compose/binaries/main/deb/ + + - name: Build with Gradle + run: ./gradlew packageSnap + env: + ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} + ORG_GRADLE_PROJECT_snapname: ${{ vars.SNAP_NAME }} + ORG_GRADLE_PROJECT_snapconfinement: ${{ vars.SNAP_CONFINEMENT }} + + - name: Upload snap to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + asset_name: processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.snap + file: app/build/compose/binaries/main/${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_${{ matrix.deb }}.snap + + - name: Upload snap to Snap Store + run: snapcraft upload --release=beta app/build/compose/binaries/main/${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_${{ matrix.deb }}.snap + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.PROCESSING_SNAPCRAFT_TOKEN }} + release-linux-flatpak: + name: (linux/${{ matrix.arch }}) Create Processing Flatpak Release + runs-on: ${{ matrix.os }} + needs: [ version, release-linux ] + container: + image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-48 + options: --privileged + permissions: + contents: write + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-24.04-arm + arch: aarch64 + deb: arm64 + farch: aarch64 + - os: ubuntu-latest + arch: x64 + deb: amd64 + farch: x86_64 + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: processing_${{ needs.version.outputs.version }}-1_${{ matrix.deb }}.deb + path: app/build/compose/binaries/main/deb/ + + - name: Setup Processing + uses: ./.github/actions/setup + + - name: Build with Gradle + run: ./gradlew generateFlatpakConfiguration + env: + ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }} + ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }} + ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }} + + - uses: flatpak/flatpak-github-actions/flatpak-builder@v6 + with: + bundle: processing.flatpak + manifest-path: app/build/compose/binaries/main/flatpak/org.processing.pde.yml + cache-key: flatpak-builder-${{ github.sha }} + arch: ${{ matrix.farch }} + + - name: Upload Flatpak to release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./build/${{ matrix.os_prefix }}/processing-${{ needs.version.outputs.version }}-${{ matrix.os_prefix}}-* - file_glob: true + asset_name: processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.flatpak + file: processing.flatpak \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5323a1a829..fe75a1afd0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -80,16 +80,17 @@ compose.desktop { upgradeUuid = "89d8d7fe-5602-4b12-ba10-0fe78efbd602" } linux { - appCategory = "Programming" + debMaintainer = "hello@processing.org" menuGroup = "Development;Programming;" + appCategory = "Programming" iconFile = rootProject.file("build/linux/processing.png") // Fix fonts on some Linux distributions jvmArgs("-Dawt.useSystemAAFontSettings=on") - fileAssociation("pde", "Processing Source Code", "application/x-processing") - fileAssociation("pyde", "Processing Python Source Code", "application/x-processing") - fileAssociation("pdez", "Processing Sketch Bundle", "application/x-processing") - fileAssociation("pdex", "Processing Contribution Bundle", "application/x-processing") + fileAssociation("application/x-processing","pde", "Processing Source Code",rootProject.file("build/shared/lib/icons/pde-512.png")) + fileAssociation("application/x-processing","pyde", "Processing Python Source Code",rootProject.file("build/shared/lib/icons/pde-512.png")) + fileAssociation("application/x-processing","pdez", "Processing Sketch Bundle",rootProject.file("build/shared/lib/icons/pde-512.png")) + fileAssociation("application/x-processing","pdex", "Processing Contribution Bundle", rootProject.file("build/shared/lib/icons/pde-512.png")) } } } @@ -158,6 +159,12 @@ tasks.register("lsp-develop"){ } val version = if(project.version == "unspecified") "1.0.0" else project.version +val distributable = { tasks.named("createDistributable").get() } +val arch = when (System.getProperty("os.arch")) { + "amd64", "x86_64" -> "amd64" + "aarch64" -> "arm64" + else -> System.getProperty("os.arch") +} tasks.register("installCreateDmg") { onlyIf { OperatingSystem.current().isMacOsX } @@ -167,11 +174,10 @@ tasks.register("packageCustomDmg"){ onlyIf { OperatingSystem.current().isMacOsX } group = "compose desktop" - val distributable = tasks.named("createDistributable").get() - dependsOn(distributable, "installCreateDmg") + dependsOn(distributable(), "installCreateDmg") - val packageName = distributable.packageName.get() - val dir = distributable.destinationDir.get() + val packageName = distributable().packageName.get() + val dir = distributable().destinationDir.get() val dmg = dir.file("../dmg/$packageName-$version.dmg").asFile val app = dir.file("$packageName.app").asFile @@ -226,81 +232,123 @@ tasks.register("packageCustomMsi"){ ) } - tasks.register("generateSnapConfiguration"){ - val name = findProperty("snapname") ?: rootProject.name - val arch = when (System.getProperty("os.arch")) { - "amd64", "x86_64" -> "amd64" - "aarch64" -> "arm64" - else -> System.getProperty("os.arch") + val name = findProperty("snapname") as String? ?: rootProject.name + val confinement = (findProperty("snapconfinement") as String?).takeIf { !it.isNullOrBlank() } ?: "strict" + val dir = distributable().destinationDir.get() + val base = layout.projectDirectory.file("linux/snapcraft.yml") + + doFirst { + replaceVariablesInFile( + base, + dir.file("../snapcraft.yaml"), + mapOf( + "name" to name, + "arch" to arch, + "version" to version as String, + "confinement" to confinement, + "deb" to "deb/${rootProject.name}_${version}-1_${arch}.deb" + ), + if (confinement == "classic") listOf("PLUGS") else emptyList() + ) } +} +tasks.register("generateFlatpakConfiguration"){ + val identifier = findProperty("flathubidentifier") as String? ?: "org.processing.pde" + + val dir = distributable().destinationDir.get() + val base = layout.projectDirectory.file("linux/flathub.yml") + + doFirst { + replaceVariablesInFile( + base, + dir.file("../flatpak/$identifier.yml"), + mapOf( + "identifier" to identifier, + "deb" to dir.file("../deb/${rootProject.name}_${version}-1_${arch}.deb").asFile.absolutePath + ), + emptyList() + ) + } +} - onlyIf { OperatingSystem.current().isLinux } - val distributable = tasks.named("createDistributable").get() - dependsOn(distributable) - - val dir = distributable.destinationDir.get() - val content = """ - name: $name - version: $version - base: core22 - summary: A creative coding editor - description: | - Processing is a flexible software sketchbook and a programming language designed for learning how to code. - confinement: strict - - apps: - processing: - command: opt/processing/bin/Processing - desktop: opt/processing/lib/processing-Processing.desktop - environment: - LD_LIBRARY_PATH: ${'$'}SNAP/opt/processing/lib/runtime/lib:${'$'}LD_LIBRARY_PATH - LIBGL_DRIVERS_PATH: ${'$'}SNAP/usr/lib/${'$'}SNAPCRAFT_ARCH_TRIPLET/dri - plugs: - - desktop - - desktop-legacy - - wayland - - x11 - - network - - opengl - - home - - removable-media - - audio-playback - - audio-record - - pulseaudio - - gpio - - parts: - processing: - plugin: dump - source: deb/processing_$version-1_$arch.deb - source-type: deb - stage-packages: - - openjdk-17-jre - override-prime: | - snapcraftctl prime - rm -vf usr/lib/jvm/java-17-openjdk-*/lib/security/cacerts - chmod -R +x opt/processing/lib/app/resources/jdk - """.trimIndent() - dir.file("../snapcraft.yaml").asFile.writeText(content) +fun replaceVariablesInFile( + source: RegularFile, + target: RegularFile, + variables: Map, + sections: List +){ + var content = source.asFile.readText() + for ((key, value) in variables) { + content = content.replace("\$$key", value) + } + if (sections.isNotEmpty()) { + for (section in sections) { + val start = content.indexOf("# $section START") + val end = content.indexOf("# $section END") + if (start != -1 && end != -1) { + val before = content.substring(0, start) + val after = content.substring(end + "# $section END".length) + content = before + after + } + } + } + target.asFile.parentFile.mkdirs() + target.asFile.writeText(content) } tasks.register("packageSnap"){ onlyIf { OperatingSystem.current().isLinux } - dependsOn("packageDeb", "generateSnapConfiguration") + dependsOn("generateSnapConfiguration") group = "compose desktop" - val distributable = tasks.named("createDistributable").get() - workingDir = distributable.destinationDir.dir("../").get().asFile + workingDir = distributable().destinationDir.dir("../").get().asFile commandLine("snapcraft") } + +tasks.register("buildFlatpak"){ + onlyIf { OperatingSystem.current().isLinux } + dependsOn("generateFlatpakConfiguration") + group = "compose desktop" + + val dir = distributable().destinationDir.get() + val identifier = findProperty("flathubidentifier") as String? ?: "org.processing.pde" + + workingDir = dir.file("../flatpak").asFile + commandLine( + "flatpak-builder", + "--install-deps-from=https://flathub.org/repo/flathub.flatpakrepo", + "--user", + "--force-clean", + "--repo=repo", + "output", + "$identifier.yml" + ) +} + +tasks.register("packageFlatpak"){ + onlyIf { OperatingSystem.current().isLinux } + dependsOn("buildFlatpak") + group = "compose desktop" + + val dir = distributable().destinationDir.get() + val identifier = findProperty("flathubidentifier") as String? ?: "org.processing.pde" + + workingDir = dir.file("../flatpak").asFile + commandLine( + "flatpak", + "build-bundle", + "./repo", + "$identifier.flatpak", + identifier + ) +} tasks.register("zipDistributable"){ dependsOn("createDistributable", "setExecutablePermissions") group = "compose desktop" - val distributable = tasks.named("createDistributable").get() - val dir = distributable.destinationDir.get() - val packageName = distributable.packageName.get() + val dir = distributable().destinationDir.get() + val packageName = distributable().packageName.get() from(dir){ eachFile{ permissions{ unix("755") } } } archiveBaseName.set(packageName) @@ -326,7 +374,7 @@ afterEvaluate{ ){ dependsOn("notarizeDmg") } - dependsOn("packageSnap", "zipDistributable") + dependsOn("zipDistributable") } } diff --git a/app/linux/flathub.yml b/app/linux/flathub.yml new file mode 100644 index 0000000000..c92ab17d9d --- /dev/null +++ b/app/linux/flathub.yml @@ -0,0 +1,38 @@ +id: $identifier +runtime: org.freedesktop.Platform +runtime-version: '24.08' +sdk: org.freedesktop.Sdk +command: Processing +finish-args: + - --socket=x11 + - --share=ipc + - --device=all + - --filesystem=home + - --socket=pulseaudio + - --share=network + +modules: + - name: Processing + buildsystem: simple + build-commands: + # Unpack Processing deb + - ar x processing.deb + - tar --zstd -xf data.tar.zst + - mv opt/processing/* /app/ + - find /app/lib/app/resources/jdk/bin -type f -exec chmod +x {} + + + # Install the desktop file and icon + - install -D /app/lib/processing-Processing.desktop /app/share/applications/$identifier.desktop + - sed -i 's/^Icon=.*/Icon=$identifier/' /app/share/applications/$identifier.desktop + - sed -i 's/^Exec=.*/Exec=\/app\/bin\/Processing/' /app/share/applications/$identifier.desktop + + # Install the mimetype info + - install -D /app/lib/processing-Processing-MimeInfo.xml /app/share/mime/packages/$identifier.xml + +# - install -D /app/lib/Processing.png /app/share/icons/hicolor/512x512/apps/$identifier.png + - install -D /app/lib/application-x-processing.png /app/share/icons/hicolor/512x512/mimetypes/$identifier-text-x-processing.png + + sources: + - type: file + path: $deb + dest-filename: processing.deb \ No newline at end of file diff --git a/app/linux/snapcraft.yml b/app/linux/snapcraft.yml new file mode 100644 index 0000000000..8206681ef0 --- /dev/null +++ b/app/linux/snapcraft.yml @@ -0,0 +1,42 @@ +name: $name +version: $version +base: core22 +summary: A creative coding editor +description: | + Processing is a flexible software sketchbook and a programming language designed for learning how to code. +confinement: $confinement + +apps: + processing: + command: opt/processing/bin/Processing + desktop: opt/processing/lib/processing-Processing.desktop + environment: + LD_LIBRARY_PATH: $SNAP/opt/processing/lib/runtime/lib:$LD_LIBRARY_PATH + LIBGL_DRIVERS_PATH: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/dri + # PLUGS START + plugs: + - desktop + - desktop-legacy + - wayland + - x11 + - network + - opengl + - home + - removable-media + - audio-playback + - audio-record + - pulseaudio + - gpio + # PLUGS END + +parts: + processing: + plugin: dump + source: $deb + source-type: deb + stage-packages: + - openjdk-17-jre + override-prime: | + snapcraftctl prime + rm -vf usr/lib/jvm/java-17-openjdk-*/lib/security/cacerts + chmod -R +x opt/processing/lib/app/resources/jdk \ No newline at end of file diff --git a/build/linux/processing-pde.xml b/build/linux/processing-pde.xml index 3b8a6837be..a869b1977d 100644 --- a/build/linux/processing-pde.xml +++ b/build/linux/processing-pde.xml @@ -2,41 +2,42 @@ Processing source code - شفرة مصدر Processing - Kryničny kod Processing - Изходен код на Processing - codi font en Processing - Processingkildekode - Processing-Quelltext - πηγαίος κώδικας Processing - Processing source code - Processing-fontkodo - código fuente en Processing - Processing iturburu-kodea - Processing-lähdekoodi - code source Processing - cód foinseach Processing - Processing-forráskód - Kode program Processing - Codice sorgente Processing - Processing ソースコード - Processing pradinis kodas - Processing pirmkods - Kod sumber Processing - Processing-kildekode - Processing-broncode - Processing-kjeldekode - Kod źródłowy Processing - código fonte Processing - Código fonte Processing - исходный код Processing - Kod burues Processing - Processing-källkod - Вихідний код на мові Processing - Mã nguồn Processing - Processing 源代码 - Processing 源代碼 + شفرة مصدر Processing + Kryničny kod Processing + Изходен код на Processing + codi font en Processing + Processingkildekode + Processing-Quelltext + πηγαίος κώδικας Processing + Processing source code + Processing-fontkodo + código fuente en Processing + Processing iturburu-kodea + Processing-lähdekoodi + code source Processing + cód foinseach Processing + Processing-forráskód + Kode program Processing + Codice sorgente Processing + Processing ソースコード + Processing pradinis kodas + Processing pirmkods + Kod sumber Processing + Processing-kildekode + Processing-broncode + Processing-kjeldekode + Kod źródłowy Processing + código fonte Processing + Código fonte Processing + исходный код Processing + Kod burues Processing + Processing-källkod + Вихідний код на мові Processing + Mã nguồn Processing + Processing 源代码 + Processing 源代碼 + diff --git a/build/shared/lib/icons/app-linux.svg b/build/shared/lib/icons/app-linux.svg new file mode 100644 index 0000000000..9b5ccd52b1 --- /dev/null +++ b/build/shared/lib/icons/app-linux.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +