Sfoglia il codice sorgente

ci: Add changelog generation (#114)

* Add custom metadata release

* Add changelog generation
Fernando Otero 7 mesi fa
parent
commit
2829c5c9cb
4 ha cambiato i file con 91 aggiunte e 8 eliminazioni
  1. 58 0
      .github/cliff.toml
  2. 15 1
      .github/workflows/publish.yml
  3. 6 1
      Cargo.toml
  4. 12 6
      scripts/publish.mts

+ 58 - 0
.github/cliff.toml

@@ -0,0 +1,58 @@
+# git-cliff configuration file
+# https://git-cliff.org/docs/configuration
+#
+# Lines starting with "#" are comments.
+# Configuration options are organized into tables and keys.
+# See documentation for more information on available options.
+
+[changelog]
+header = """
+## What's new
+"""
+# template for the changelog body
+# https://tera.netlify.app/docs
+body = """
+{% for group, commits in commits | group_by(attribute="group") %}\
+    {% for commit in commits %}
+        - {{ commit.message | upper_first | split(pat="\n") | first | trim }}\
+        {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif %}\
+    {% endfor %}\
+{% endfor %}
+"""
+# remove the leading and trailing whitespace from the template
+trim = true
+footer = """
+"""
+postprocessors = [ ]
+[git]
+# parse the commits based on https://www.conventionalcommits.org
+conventional_commits = true
+# filter out the commits that are not conventional
+filter_unconventional = false
+# process each line of a commit as an individual commit
+split_commits = false
+# regex for preprocessing the commit messages
+commit_preprocessors = []
+# regex for parsing and grouping commits
+commit_parsers = [
+    { message = "^build\\(deps\\)", skip = true },
+    { message = "^build\\(deps-dev\\)", skip = true },
+    { message = "^ci", skip = true },
+    { body = ".*", group = "Changes" },
+]
+# protect breaking changes from being skipped due to matching a skipping commit_parser
+protect_breaking_commits = false
+# filter out the commits that are not matched by commit parsers
+filter_commits = false
+# glob pattern for matching git tags
+tag_pattern = "v[0-9]*"
+# regex for skipping tags
+skip_tags = ""
+# regex for ignoring tags
+ignore_tags = ""
+# sort the tags topologically
+topo_order = false
+# sort the commits inside sections by oldest/newest order
+sort_commits = "newest"
+# limit the number of commits included in the changelog.
+# limit_commits = 42

+ 15 - 1
.github/workflows/publish.yml

@@ -140,8 +140,22 @@ jobs:
 
           pnpm tsx ./scripts/publish.mts ${{ inputs.crate }} $LEVEL $OPTIONS
 
+      - name: Generate a changelog
+        if: github.event.inputs.dry_run != 'true' && github.event.inputs.create_release == 'true'
+        uses: orhun/git-cliff-action@v3
+        with:
+          config: ".github/cliff.toml"
+          args: |
+            "${{ steps.publish.outputs.old_git_tag }}"..main
+            --include-path "${{ inputs.crate }}/**"
+            --github-repo "${{ github.repository }}"
+        env:
+          OUTPUT: CHANGELOG.md
+          GITHUB_REPO: ${{ github.repository }}
+
       - name: Create GitHub release
         if: github.event.inputs.dry_run != 'true' && github.event.inputs.create_release == 'true'
         uses: ncipollo/release-action@v1
         with:
-          tag: ${{ steps.publish.outputs.crate }}@v${{ steps.publish.outputs.version }}
+          tag: ${{ steps.publish.outputs.new_git_tag }}
+          bodyFile: CHANGELOG.md

+ 6 - 1
Cargo.toml

@@ -32,4 +32,9 @@ solana = "2.2.0"
 build = "1.84.1"
 format = "nightly-2024-11-22"
 lint = "nightly-2024-11-22"
-test = "1.84.1"
+test = "1.84.1"
+
+[workspace.metadata.release]
+pre-release-commit-message = "Publish {{crate_name}} v{{version}}"
+tag-message = "Publish {{crate_name}} v{{version}}"
+consolidate-commits = false

+ 12 - 6
scripts/publish.mts

@@ -18,8 +18,10 @@ if (!level) {
   throw new Error('A version level — e.g. "patch" — must be provided.');
 }
 
-// Get the crate name.
-const crate = getCargo(folder).package['name'];
+// Get the package information from the crate TOML file.
+const crate = getCargo(folder).package;
+const previous = crate['version'];
+const name = crate['name'];
 
 // Go to the crate folder to release.
 cd(path.dirname(manifestPath));
@@ -27,7 +29,7 @@ cd(path.dirname(manifestPath));
 // Publish the new version.
 const releaseArgs = dryRun
   ? []
-  : ['--tag-name', `${crate}@v{{version}}`, '--no-confirm', '--execute'];
+  : ['--tag-name', `${name}@v{{version}}`, '--no-confirm', '--execute'];
 await $`cargo release ${level} ${releaseArgs}`;
 
 // Stop here if this is a dry run.
@@ -38,8 +40,12 @@ if (dryRun) {
 // Get the updated version number.
 const version = getCargo(folder).package['version'];
 
-// Expose the new version to CI if needed.
+// Git tag for the new and old versions.
+const newGitTag = `${name}@v${version}`;
+const oldGitTag = `${name}@v${previous}`;
+
+// Expose the versions to CI if needed.
 if (process.env.CI) {
-  await $`echo "crate=${crate}" >> $GITHUB_OUTPUT`;
-  await $`echo "version=${version}" >> $GITHUB_OUTPUT`;
+  await $`echo "new_git_tag=${newGitTag}" >> $GITHUB_OUTPUT`;
+  await $`echo "old_git_tag=${oldGitTag}" >> $GITHUB_OUTPUT`;
 }