JReleaser’s Release

It should be no surprise that JReleaser relies on itself to create its releases.

The following configuration file is used to create both release and snapshot releases:

jreleaser.yml
# Define properties we'll use later in this file
environment:
  properties:
    jdkPathPrefix: 'apps/jreleaser/build/jdks'
    jdkFilePrefix: 'zulu17.30.15-ca-jdk17.0.1'

# General information about this project
project:
  name: jreleaser
  description: Release projects quickly and easily with JReleaser
  longDescription: |
    JReleaser is a release automation tool. Its goal is to simplify creating releases and
    publishing artifacts to multiple package managers while providing customizable options.

    JReleaser takes inputs from popular builds tools (Ant, Maven, Gradle) such as JAR files,
    binary distributions (.zip, .tar), jlink images, or any other file that you’d like to
    publish as a Git release on popular Git services such as GitHub, GitLab, or Gitea.
    Distribution files may additionally be published to be consumed by popular package managers
    such as Homebrew, Chocolatey, Snapcraft, or get ready to be launched via JBang. Releases
    may be announced in a variety of channels such as Twitter, Zulip, SDKMAN!, and more.

  website: https://jreleaser.org
  authors:
    - Andres Almiray
  license: Apache-2.0
  java:
    groupId: org.jreleaser
    version: 8
    multiProject: true
  extraProperties:
    inceptionYear: 2020

release:
  github:
    overwrite: true
    sign: true
    discussionCategoryName: Announcements
    changelog:
      formatted: ALWAYS
      format: '- {{commitShortHash}} {{commitTitle}}'
      contributors:
        format: '- {{contributorName}}{{#contributorUsernameAsLink}} ({{.}}){{/contributorUsernameAsLink}}'
      # Label commits by matching their first line
      labelers:
        - label: 'merge_pull'
          title: 'Merge pull'
        - label: 'merge_branch'
          title: 'Merge branch'
        - label: 'translation'
          title: '[translation]'
        - label: 'task'
          title: '[chore]'
        - label: 'dependencies'
          title: '[deps]'
        - label: 'build'
          title: '[build]'
        - label: 'feature'
          title: 'Resolves #'
          body: 'Resolves #'
        - label: 'issue'
          title: 'Fixes #'
          body: 'Fixes #'
        - label: 'issue'
          title: 'Relates to #'
          body: 'Relates to #'
        - label: 'allcontributors'
          title: 'docs: update'
      # Categorize commits by labels
      categories:
        - title: 'Merge'
          labels:
            - 'merge_pull'
            - 'merge_branch'
        - title: '🚀 Features'
          labels:
            - 'feature'
        - title: '✅ Issues'
          labels:
            - 'issue'
        - title: '🧰 Tasks'
          labels:
            - 'task'
        - title: '🌐 Translation'
          labels:
            - 'translation'
        - title: '⚙️  Dependencies'
          labels:
            - 'dependencies'
        - title: '🛠  Build'
          labels:
            - 'build'
        - title: 'allcontributors'
          labels:
            - 'allcontributors'
      hide:
        # hide Merge commits
        categories:
          - 'Merge'
          - 'allcontributors'
        # hide contributions from GitHub bots
        contributors:
          - 'GitHub'
          - 'allcontributors'
      replacers:
        # Remove `[chore] ` from the commit message
        - search: '\[chore\] '
        # Remove `[deps] ` from the commit message
        - search: '\[deps\] '
        # Remove `[translation] ` from the commit message
        - search: '\[translation\] '
        # Remove `[build] ` from the commit message
        - search: '\[build\] '

# File signing is always active
signing:
  active: always
  armored: true
  # Do not sign additional files, only distribution artifacts and checksums
  files: false

checksum:
  # Do not checksum additional files, only distribution artifacts
  files: false

# Announcing a release only occurs when it's not snapshot
announce:
  twitter:
    active: release
    status: 🚀 JReleaser {{projectVersion}} has been released! {{releaseNotesUrl}}

# Configure a cross-platform Jlink assembly
assemble:
  jlink:
    jreleaser-standalone:
      active: always
      java:
        version: 11
        mainClass: 'org.jreleaser.cli.Main'
      imageName: '{{distributionName}}-{{projectEffectiveVersion}}'
      executable: 'jreleaser'
      jdeps:
        multiRelease: base
        ignoreMissingDeps: true
      targetJdks:
        - path: '{{jdkPathPrefix}}/zulu17Osx/{{jdkFilePrefix}}-macosx_x64/zulu-17.jdk/Contents/Home'
          platform: 'osx-x86_64'
        - path: '{{jdkPathPrefix}}/zulu17OsxArm/{{jdkFilePrefix}}-macosx_aarch64/zulu-17.jdk/Contents/Home'
          platform: 'osx-aarch64'
        - path: '{{jdkPathPrefix}}/zulu17Linux/{{jdkFilePrefix}}-linux_x64'
          platform: 'linux-x86_64'
        - path: '{{jdkPathPrefix}}/zulu17LinuxArm/{{jdkFilePrefix}}-linux_aarch64'
          platform: 'linux-aarch64'
        - path: '{{jdkPathPrefix}}/zulu17LinuxMusl/{{jdkFilePrefix}}-linux_musl_x64'
          platform: 'linux_musl-x86_64'
        - path: '{{jdkPathPrefix}}/zulu17LinuxMuslArm/{{jdkFilePrefix}}-linux_musl_aarch64'
          platform: 'linux_musl-aarch64'
        - path: '{{jdkPathPrefix}}/zulu17Windows/{{jdkFilePrefix}}-win_x64'
          platform: 'windows-x86_64'
        - path: '{{jdkPathPrefix}}/zulu17WindowsArm/{{jdkFilePrefix}}-win_aarch64'
          platform: 'windows-aarch64'
      mainJar:
        path: 'apps/jreleaser/build/libs/jreleaser-{{projectVersion}}.jar'
      jars:
        - pattern: 'apps/jreleaser/build/dependencies/flat/*.jar'

# Configure 4 distributions
distributions:
  # Distribution 1 is of type JAVA_BINARY
  jreleaser:
    java:
      mainClass: org.jreleaser.cli.Main
    brew:
      active: always
      tap:
        active: release
    chocolatey:
      active: always
      remoteBuild: true
      title: JReleaser
      bucket:
        active: release
    jbang:
      active: always
    macports:
      active: always
      categories:
        - devel
        - java
      maintainers:
        - '@aalmiray'
      repository:
        active: release
        name: jreleaser-macports
    scoop:
      active: always
      bucket:
        active: release
    sdkman:
      active: release
    snap:
      active: always
      remoteBuild: true
      base: core18
      localPlugs:
        - network
        - home
    spec:
      active: always
      repository:
        active: release
        name: jreleaser-copr
    artifacts:
      # Transform the artifact name
      - path: apps/{{distributionName}}/build/distributions/{{distributionName}}-{{projectVersion}}.zip
        transform: '{{distributionName}}/{{distributionName}}-{{projectEffectiveVersion}}.zip'
      - path: apps/{{distributionName}}/build/distributions/{{distributionName}}-{{projectVersion}}.tar
        transform: '{{distributionName}}/{{distributionName}}-{{projectEffectiveVersion}}.tar'

  # Distribution 2 is of type JAVA_BINARY
  jreleaser-ant-tasks:
    artifacts:
      # Transform the artifact name
      - path: plugins/{{distributionName}}/build/distributions/{{distributionName}}-{{projectVersion}}.zip
        transform: '{{distributionName}}/{{distributionName}}-{{projectEffectiveVersion}}.zip'

  # Distribution 3 is of type SINGLE_JAR
  jreleaser-tool-provider:
    type: SINGLE_JAR
    artifacts:
      # Transform the artifact name
      - path: apps/{{distributionName}}/build/libs/{{distributionName}}-{{projectVersion}}.jar
        transform: '{{distributionName}}/{{distributionName}}-{{projectEffectiveVersion}}.jar'

  # Distribution 4 is of type JLINK
  # Name matches the assembled Jlink distribution
  jreleaser-standalone:
    docker:
      # inherited by specs
      active: always
      # inherited by specs
      registries:
        - serverName: DEFAULT
          username: jreleaser
      # inherited by specs
      labels:
        'org.opencontainers.image.title': 'jreleaser'
      # inherited by specs
      postCommands:
        - 'VOLUME /workspace'
      # configure 2 specs
      specs:
        slim:
          imageNames:
            - 'jreleaser/jreleaser-{{dockerSpecName}}:{{tagName}}'
            - 'jreleaser/jreleaser-{{dockerSpecName}}:latest'
          # match by platform
          matchers:
            platform: 'linux-x86_64'
          preCommands:
            - 'RUN apt-get update -y'
            - 'RUN apt-get install unzip'
        alpine:
          imageNames:
            - 'jreleaser/jreleaser-{{dockerSpecName}}:{{tagName}}'
            - 'jreleaser/jreleaser-{{dockerSpecName}}:latest'
          # match by platform
          matchers:
            platform: 'linux_musl-x86_64'
          preCommands:
            - 'RUN apk add unzip'

files:
  artifacts:
    - path: VERSION

Which will create and tag a prerelease on GitHub when the project is snapshot, and a regular release when the project is not snapshot.

The release will have the following assets:

# additional files
VERSION

# checksums
checksums_rmd160.txt
checksums_sha256.txt
jreleaser-0.9.1-SNAPSHOT.zip.rmd160
jreleaser-0.9.1-SNAPSHOT.zip.sha256

# binaries created by the build
jreleaser-0.9.1-SNAPSHOT.tar
jreleaser-0.9.1-SNAPSHOT.zip
jreleaser-ant-tasks-0.9.1-SNAPSHOT.zip
jreleaser-tool-provider-0.9.1-SNAPSHOT.jar

# binaries created by the Jlink assembler
jreleaser-standalone-0.9.1-SNAPSHOT-linux-aarch64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-linux-x86_64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-linux_musl-aarch64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-linux_musl-x86_64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-osx-aarch64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-osx-x86_64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-windows-aarch64.zip
jreleaser-standalone-0.9.1-SNAPSHOT-windows-x86_64.zip

# signatures
checksums_rmd160.txt.asc
checksums_sha256.txt.asc
jreleaser-0.9.1-SNAPSHOT.tar.asc
jreleaser-0.9.1-SNAPSHOT.zip.asc
jreleaser-ant-tasks-0.9.1-SNAPSHOT.zip.asc
jreleaser-tool-provider-0.9.1-SNAPSHOT.jar.asc
jreleaser-standalone-0.9.1-SNAPSHOT-linux-aarch64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-linux-x86_64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-linux_musl-aarch64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-linux_musl-x86_64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-osx-aarch64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-osx-x86_64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-windows-aarch64.zip.asc
jreleaser-standalone-0.9.1-SNAPSHOT-windows-x86_64.zip.asc

Additionally, the following repositories will be updated with new packagers:

Docker images will also be published to DockerHub: