From ed7aa6984318078f9320137a3338768191a01bc7 Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 10:23:03 -0400 Subject: [PATCH 01/10] Fixing `CHANGELOG.md` links --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 574f437f64..2b72006d45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang -## [0.16.2](https://github.com/opsmill/infrahub/tree/v0.16.2) - 2024-10-01 +## [Infrahub - v0.16.2](https://github.com/opsmill/infrahub/tree/infrahub-v0.16.2) - 2024-10-01 ### Fixed @@ -23,7 +23,7 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang - Fix performance issue for GraphQL queries that only count nodes. ([#4454](https://github.com/opsmill/infrahub/issues/4454)) - Fix ability to construct HFID for upsert mutations where a number attribute is used. ([#4460](https://github.com/opsmill/infrahub/issues/4460)) -## [0.16.1](https://github.com/opsmill/infrahub/tree/v0.16.1) - 2024-09-24 +## [Infrahub - v0.16.1](https://github.com/opsmill/infrahub/tree/infrahub-v0.16.1) - 2024-09-24 The largest change in this version is the movement of the Infrahub SDK into a [separate repository](https://github.com/opsmill/infrahub-sdk-python) and package. @@ -88,7 +88,7 @@ git submodule update --init - Added cancel button in repository form ([#4402](https://github.com/opsmill/infrahub/issues/4402)) - Fixes the tasks pagination in the proposed changes tab ([#4434](https://github.com/opsmill/infrahub/issues/4434)) -## [0.16.0](https://github.com/opsmill/infrahub/tree/v0.16.0) - 2024-09-11 +## [Infrahub - v0.16.0](https://github.com/opsmill/infrahub/tree/infrahub-v0.16.0) - 2024-09-11 ### Removed @@ -137,7 +137,7 @@ git submodule update --init - Do not allow '/' character in repository name to avoid sync failure. ([#4120](https://github.com/opsmill/infrahub/issues/4120)) - Can't close a comment thread on an Artifact. ([#4189](https://github.com/opsmill/infrahub/issues/4189)) -## [0.15.3](https://github.com/opsmill/infrahub/tree/v0.15.3) - 2024-08-13 +## [Infrahub - v0.15.3](https://github.com/opsmill/infrahub/tree/infrahub-v0.15.3) - 2024-08-13 ### Added From 48248f49b4ea658ce4c21197bdd118273a8e833e Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 10:26:39 -0400 Subject: [PATCH 02/10] Adding test newsfile for towncrier work --- changelog/+testing.fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/+testing.fix.md diff --git a/changelog/+testing.fix.md b/changelog/+testing.fix.md new file mode 100644 index 0000000000..070e0110b3 --- /dev/null +++ b/changelog/+testing.fix.md @@ -0,0 +1 @@ +Fixing weird Towncrier behavior. \ No newline at end of file From 000a656918dee4fc6d0bdf65330d80dcab5b89e4 Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 11:11:02 -0400 Subject: [PATCH 03/10] adding custom `towncrier` template to fix spacing in generated CHANGELOG.md --- changelog/towncrier_template.md | 54 +++++++++++++++++++++++++++++++++ pyproject.toml | 3 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 changelog/towncrier_template.md diff --git a/changelog/towncrier_template.md b/changelog/towncrier_template.md new file mode 100644 index 0000000000..55f6ed266e --- /dev/null +++ b/changelog/towncrier_template.md @@ -0,0 +1,54 @@ +{% if render_title %} +{% if versiondata.name %} +# {{ versiondata.name }} {{ versiondata.version }} ({{ versiondata.date }}) +{% else %} +# {{ versiondata.version }} ({{ versiondata.date }}) +{% endif %} +{% endif %} +{% for section, _ in sections.items() %} +{% if section %} + +## {{section}} +{% endif %} + +{% if sections[section] %} +{% for category, val in definitions.items() if category in sections[section] %} +### {{ definitions[category]['name'] }} + +{% for text, values in sections[section][category].items() %} +- {{ text }} +{%- if values %} +{% if "\n - " in text or '\n * ' in text %} + + + ( +{%- else %} +{% if text %} ({% endif %} +{%- endif -%} +{%- for issue in values %} +{{ issue.split(": ", 1)[0] }}{% if not loop.last %}, {% endif %} +{%- endfor %} +{% if text %}){% endif %} + +{% else %} + +{% endif %} +{% endfor %} + +{% if issues_by_category[section][category] and "]: " in issues_by_category[section][category][0] %} +{% for issue in issues_by_category[section][category] %} +{{ issue }} +{% endfor %} + +{% endif %} +{% if sections[section][category]|length == 0 %} +No significant changes. + +{% else %} +{% endif %} +{% endfor %} +{% else %} +No significant changes. + +{% endif %} +{% endfor +%} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 679ed29034..aa5fe131f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -636,9 +636,10 @@ directory = "changelog" filename = "CHANGELOG.md" start_string = "\n" underlines = ["", "", ""] -title_format = "## [{version}](https://github.com/opsmill/infrahub/tree/v{version}) - {project_date}" +title_format = "## [Infrahub - v{version}](https://github.com/opsmill/infrahub/tree/infrahub-v{version}) - {project_date}" issue_format = "[#{issue}](https://github.com/opsmill/infrahub/issues/{issue})" orphan_prefix = "+" +template = "changelog/towncrier_template.md" [[tool.towncrier.type]] directory = "security" From 17f7cc689099939fc612b835c0ca7c24f1e926db Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 11:12:19 -0400 Subject: [PATCH 04/10] adding newsfragments for incoming changes --- changelog/+changelog_edits.fixed.md | 1 + changelog/+testing.fix.md | 1 - changelog/+towncrier_template.added.md | 1 + changelog/4519.added.md | 1 + 4 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 changelog/+changelog_edits.fixed.md delete mode 100644 changelog/+testing.fix.md create mode 100644 changelog/+towncrier_template.added.md create mode 100644 changelog/4519.added.md diff --git a/changelog/+changelog_edits.fixed.md b/changelog/+changelog_edits.fixed.md new file mode 100644 index 0000000000..d47df28327 --- /dev/null +++ b/changelog/+changelog_edits.fixed.md @@ -0,0 +1 @@ +Editing old `CHANGELOG.md` entries to use uniform formatting from new Towncrier template. \ No newline at end of file diff --git a/changelog/+testing.fix.md b/changelog/+testing.fix.md deleted file mode 100644 index 070e0110b3..0000000000 --- a/changelog/+testing.fix.md +++ /dev/null @@ -1 +0,0 @@ -Fixing weird Towncrier behavior. \ No newline at end of file diff --git a/changelog/+towncrier_template.added.md b/changelog/+towncrier_template.added.md new file mode 100644 index 0000000000..20973efe58 --- /dev/null +++ b/changelog/+towncrier_template.added.md @@ -0,0 +1 @@ +Added custom Towncrier template to remove extra space after new Changelog entries. \ No newline at end of file diff --git a/changelog/4519.added.md b/changelog/4519.added.md new file mode 100644 index 0000000000..db23266f38 --- /dev/null +++ b/changelog/4519.added.md @@ -0,0 +1 @@ +Adding `invoke` tasks to assist with release process. \ No newline at end of file From c41d68aa682415f22566494701499aa69193c346 Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 11:33:23 -0400 Subject: [PATCH 05/10] stashing WIP --- tasks/__init__.py | 3 ++- tasks/release.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tasks/release.py diff --git a/tasks/__init__.py b/tasks/__init__.py index b901182e54..034bf0ea4a 100644 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -2,7 +2,7 @@ from invoke import Collection, Context, task -from . import backend, demo, dev, docs, main, performance, schema, sdk, sync +from . import backend, demo, dev, docs, main, performance, release, schema, sdk, sync ns = Collection() ns.add_collection(sdk) @@ -14,6 +14,7 @@ ns.add_collection(main) ns.add_collection(schema) ns.add_collection(sync) +ns.add_collection(release) @task diff --git a/tasks/release.py b/tasks/release.py new file mode 100644 index 0000000000..61617c1a15 --- /dev/null +++ b/tasks/release.py @@ -0,0 +1,44 @@ +"""Release related Invoke Tasks. +""" + +from invoke import Context, task + + +from .utils import ESCAPED_REPO_PATH, check_if_command_available + + +@task +def markdownlint(context: Context): + has_markdownlint = check_if_command_available( + context=context, command_name="markdownlint-cli2" + ) + + if not has_markdownlint: + print("Warning, markdownlint-cli2 is not installed") + return + exec_cmd = "markdownlint-cli2 'changelog/*.md' '!changelog/towncrier_template.md' 'CHANGELOG.md' 'docs/docs/release-notes/infrahub/*.{md,mdx}'" + print(" - [release] Lint release files with markdownlint-cli2") + with context.cd(ESCAPED_REPO_PATH): + context.run(exec_cmd) + + +@task +def vale(context: Context): + """Run vale to validate the release notes.""" + has_vale = check_if_command_available(context=context, command_name="vale") + + if not has_vale: + print("Warning, Vale is not installed") + return + + exec_cmd = "vale $(find ./changelog ./docs/docs/release-notes/infrahub -type f \\( -name '*.mdx' -o -name '*.md' \\)) CHANGELOG.md" + print(" - [release] Lint release files with vale") + with context.cd(ESCAPED_REPO_PATH): + context.run(exec_cmd) + + +@task +def lint(context: Context): + """This will run all linter.""" + markdownlint(context) + vale(context) From e1323ea00639bbbf6e82c40bbfff613a0e4c2e49 Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 14:23:43 -0400 Subject: [PATCH 06/10] renaming to make linter globbing and editing of the file easier --- .../{towncrier_template.md => towncrier_template.md.template} | 0 pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename changelog/{towncrier_template.md => towncrier_template.md.template} (100%) diff --git a/changelog/towncrier_template.md b/changelog/towncrier_template.md.template similarity index 100% rename from changelog/towncrier_template.md rename to changelog/towncrier_template.md.template diff --git a/pyproject.toml b/pyproject.toml index aa5fe131f3..61d9549f2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -639,7 +639,7 @@ underlines = ["", "", ""] title_format = "## [Infrahub - v{version}](https://github.com/opsmill/infrahub/tree/infrahub-v{version}) - {project_date}" issue_format = "[#{issue}](https://github.com/opsmill/infrahub/issues/{issue})" orphan_prefix = "+" -template = "changelog/towncrier_template.md" +template = "changelog/towncrier_template.md.template" [[tool.towncrier.type]] directory = "security" From 0b36fe4e5f4717182190b049d37b71046fcf478e Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 14:40:01 -0400 Subject: [PATCH 07/10] adding mdlinting and vale checks to release files --- .github/file-filters.yml | 9 +++++++- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++--- .vale.ini | 3 +++ .vale/styles/spelling-exceptions.txt | 1 + CHANGELOG.md | 4 ++-- tasks/docs.py | 2 +- tasks/release.py | 23 ++++++++++++++----- 7 files changed, 63 insertions(+), 12 deletions(-) diff --git a/.github/file-filters.yml b/.github/file-filters.yml index 1a9eacdeee..3e62ed8bae 100644 --- a/.github/file-filters.yml +++ b/.github/file-filters.yml @@ -31,6 +31,11 @@ doc_files: &doc_files - package.json - package-lock.json +release_files: &release_files + - "changelog/*.md" + - CHANGELOG.md + - "docs/docs/relese_notes/infrahub/*.mdx" + helm_files: &helm_files - "helm/**" @@ -46,7 +51,6 @@ yaml_all: &yaml_all markdown_all: &markdown_all - "**/*.{md,mdx}" - backend_all: - *backend_files - *ci_config @@ -58,6 +62,9 @@ documentation_all: - *doc_files - *markdown_all +release_all: + - *release_files + helm_all: - *helm_files diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5db74683b4..4f0bc59cf1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,7 @@ jobs: outputs: backend: ${{ steps.changes.outputs.backend_all }} documentation: ${{ steps.changes.outputs.documentation_all }} + release: ${{ steps.changes.outputs.release_all }} frontend: ${{ steps.changes.outputs.frontend_all }} helm: ${{ steps.changes.outputs.helm_all }} e2e: ${{ steps.changes.outputs.e2e_all }} @@ -130,7 +131,9 @@ jobs: run: "ruff format --check --diff ." markdown-lint: - if: needs.files-changed.outputs.documentation == 'true' + if: | + needs.files-changed.outputs.documentation == 'true' || + needs.files-changed.outputs.release == 'true' needs: ["files-changed"] runs-on: "ubuntu-latest" timeout-minutes: 5 @@ -145,7 +148,6 @@ jobs: config: .markdownlint.yaml globs: | **/*.{md,mdx} - !changelog/*.md action-lint: if: needs.files-changed.outputs.github_workflows == 'true' @@ -528,7 +530,32 @@ jobs: env: VALE_VERSION: ${{ env.VALE_VERSION }} - name: "Validate documentation style" - run: ./vale $(find . -type f \( -name "*.mdx" -o -name "*.md" \) -not -path "./docs/node_modules/*") + run: ./vale $(find ./docs -type f \( -name "*.mdx" -o -name "*.md" \) -not -path "./docs/node_modules/*") + + validate-release-notes-style: + if: | + always() && !cancelled() && + !contains(needs.*.result, 'failure') && + !contains(needs.*.result, 'cancelled') && + needs.files-changed.outputs.documentation == 'true' + needs: ["files-changed", "yaml-lint", "python-lint"] + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - name: "Check out repository code" + uses: "actions/checkout@v4" + with: + submodules: true + # The official GitHub Action for Vale doesn't work, installing manually instead: + # https://github.com/errata-ai/vale-action/issues/103 + - name: Download Vale + run: | + curl -sL "https://github.com/errata-ai/vale/releases/download/v${VALE_VERSION}/vale_${VALE_VERSION}_Linux_64-bit.tar.gz" -o vale.tar.gz + tar -xzf vale.tar.gz + env: + VALE_VERSION: ${{ env.VALE_VERSION }} + - name: "Validate documentation style" + run: ./vale $(find ./changelog ./docs/docs/release-notes/infrahub -type f \( -name '*.mdx' -o -name '*.md' \)) CHANGELOG.md # ------------------------------------------ E2E Tests ------------------------------------------ E2E-testing-playwright: diff --git a/.vale.ini b/.vale.ini index d5cefaa853..700cbe8748 100644 --- a/.vale.ini +++ b/.vale.ini @@ -10,3 +10,6 @@ BasedOnStyles = Infrahub ;(import.*?\n) to ignore import statement in .mdx ;(```.*?```\n) to ignore code block in .mdx BlockIgnores = (?s) *((import.*?\n)|(```.*?```\n)) + +[*] +BasedOnStyles = Infrahub diff --git a/.vale/styles/spelling-exceptions.txt b/.vale/styles/spelling-exceptions.txt index c0fb18b4a6..fde2e5e44f 100644 --- a/.vale/styles/spelling-exceptions.txt +++ b/.vale/styles/spelling-exceptions.txt @@ -98,6 +98,7 @@ subnet template_path toml Towncrier +towncrier uncheck uniqueness_constraints validator diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b72006d45..06df438354 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ -# Infrahub Changelog +# Infrahub changelog This is the changelog for Infrahub. All notable changes to this project will be documented in this file. -Issue tracking is located in [Github](https://github.com/opsmill/infrahub/issues). +Issue tracking is located in [GitHub](https://github.com/opsmill/infrahub/issues). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/tasks/docs.py b/tasks/docs.py index 6082a5e3e6..3f5a3bcf00 100644 --- a/tasks/docs.py +++ b/tasks/docs.py @@ -127,7 +127,7 @@ def vale(context: Context): print("Warning, Vale is not installed") return - exec_cmd = "vale $(find . -type f \\( -name '*.mdx' -o -name '*.md' \\) -not -path './docs/node_modules/*')" + exec_cmd = "vale $(find ./docs -type f \\( -name '*.mdx' -o -name '*.md' \\) -not -path './docs/node_modules/*')" print(" - [docs] Lint docs with vale") with context.cd(ESCAPED_REPO_PATH): context.run(exec_cmd) diff --git a/tasks/release.py b/tasks/release.py index 61617c1a15..44bb2b654d 100644 --- a/tasks/release.py +++ b/tasks/release.py @@ -1,5 +1,4 @@ -"""Release related Invoke Tasks. -""" +"""Release related Invoke Tasks.""" from invoke import Context, task @@ -9,9 +8,7 @@ @task def markdownlint(context: Context): - has_markdownlint = check_if_command_available( - context=context, command_name="markdownlint-cli2" - ) + has_markdownlint = check_if_command_available(context=context, command_name="markdownlint-cli2") if not has_markdownlint: print("Warning, markdownlint-cli2 is not installed") @@ -37,8 +34,24 @@ def vale(context: Context): context.run(exec_cmd) +@task +def draft(context: Context): + """Run `towncrier build --draft` to validate that Towncrier can read the Newsfragments.""" + has_towncrier = check_if_command_available(context=context, command_name="towncrier") + + if not has_towncrier: + print("Warning, Towncrier is not installed") + return + + exec_cmd = "towncrier build --draft" + print(" - [release] Verify Towncrier render possible") + with context.cd(ESCAPED_REPO_PATH): + context.run(exec_cmd) + + @task def lint(context: Context): """This will run all linter.""" markdownlint(context) vale(context) + draft(context) From b79810290b4d951ea2725f188e06c7dfa7c28eae Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 14:42:59 -0400 Subject: [PATCH 08/10] lint fixes --- .github/workflows/ci.yml | 2 +- tasks/release.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f0bc59cf1..17d3984f76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -531,7 +531,7 @@ jobs: VALE_VERSION: ${{ env.VALE_VERSION }} - name: "Validate documentation style" run: ./vale $(find ./docs -type f \( -name "*.mdx" -o -name "*.md" \) -not -path "./docs/node_modules/*") - + validate-release-notes-style: if: | always() && !cancelled() && diff --git a/tasks/release.py b/tasks/release.py index 44bb2b654d..e6c91391fa 100644 --- a/tasks/release.py +++ b/tasks/release.py @@ -2,7 +2,6 @@ from invoke import Context, task - from .utils import ESCAPED_REPO_PATH, check_if_command_available From 22c59041ad8a874d2c844d06e77855e1d0c25559 Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Wed, 2 Oct 2024 16:13:17 -0400 Subject: [PATCH 09/10] stash WIP --- tasks/release.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tasks/release.py b/tasks/release.py index e6c91391fa..d41c0478d4 100644 --- a/tasks/release.py +++ b/tasks/release.py @@ -50,7 +50,27 @@ def draft(context: Context): @task def lint(context: Context): - """This will run all linter.""" + """This will run all linters.""" markdownlint(context) vale(context) draft(context) + + +@task +def build_changelog(context: Context): + has_towncrier = check_if_command_available(context=context, command_name="towncrier") + + if not has_towncrier: + print("Warning, Towncrier is not installed") + return + + exec_cmd = "towncrier build --draft 2> /dev/null" + with context.cd(ESCAPED_REPO_PATH): + changelog_contents = context.run(exec_cmd, hide="stdout").stdout + # print(changelog_contents) + + +@task +def ship(context: Context): + """This will generate the Release Notes and prepare to ship the release.""" + lint(context) From 8ececc5da5b40ea06b53f9cccf7e7f8e622d49fc Mon Sep 17 00:00:00 2001 From: Brett Lykins Date: Mon, 7 Oct 2024 10:00:32 -0400 Subject: [PATCH 10/10] more template fixes --- changelog/docs_release_notes.mdx.template | 30 +++++++++++++++++++ changelog/github_release_notes.md.template | 19 ++++++++++++ ...late.md.template => towncrier.md.template} | 0 pyproject.toml | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 changelog/docs_release_notes.mdx.template create mode 100644 changelog/github_release_notes.md.template rename changelog/{towncrier_template.md.template => towncrier.md.template} (100%) diff --git a/changelog/docs_release_notes.mdx.template b/changelog/docs_release_notes.mdx.template new file mode 100644 index 0000000000..96c861e00e --- /dev/null +++ b/changelog/docs_release_notes.mdx.template @@ -0,0 +1,30 @@ +--- +title: Release {{ version }} +--- + + + + + + + + + + + + + + + + + + + +
Release Number{{ version }}
Release Date{{ today }}
Release Codename{{ codename }}
Tag[infrahub-v{{ version }}](https://github.com/opsmill/infrahub/releases/tag/infrahub-v{{ version }})
+ +# Release 0.16.2 + +We are thrilled to announce the latest release of Infrahub, version *{{ version }}*! + +This release focuses largely on bug fixes and is driven by our Beta Test users, +and as always we greatly appreciate their feedback and time! diff --git a/changelog/github_release_notes.md.template b/changelog/github_release_notes.md.template new file mode 100644 index 0000000000..8b32985789 --- /dev/null +++ b/changelog/github_release_notes.md.template @@ -0,0 +1,19 @@ +## Main Changes + +{{ changelog_contents }} + +## Migration Guide + +### Rebuild the demo environment + +It's mandatory to completely rebuild your demo environment with the following commands. + +``` +invoke demo.destroy demo.build demo.start +invoke demo.load-infra-schema +invoke demo.load-infra-data +``` + +> All data will be lost, please make sure to backup everything you need before running this command. + +The repository https://github.com/opsmill/infrahub-demo-edge has also been updated, it's recommend to pull the latest changes into your fork. diff --git a/changelog/towncrier_template.md.template b/changelog/towncrier.md.template similarity index 100% rename from changelog/towncrier_template.md.template rename to changelog/towncrier.md.template diff --git a/pyproject.toml b/pyproject.toml index 61d9549f2b..cf40979343 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -639,7 +639,7 @@ underlines = ["", "", ""] title_format = "## [Infrahub - v{version}](https://github.com/opsmill/infrahub/tree/infrahub-v{version}) - {project_date}" issue_format = "[#{issue}](https://github.com/opsmill/infrahub/issues/{issue})" orphan_prefix = "+" -template = "changelog/towncrier_template.md.template" +template = "changelog/towncrier.md.template" [[tool.towncrier.type]] directory = "security"