Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/ai-context/powershell-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,5 @@ DataCenter track requires `CI_CONFLUENCE_TYPE=DataCenter`, `CI_CONFLUENCE_URL`,
- Include changelog updates for user-visible behavior changes.
- `.github/workflows/ci.yml` path filters can skip instruction-only changes.
- `.github/workflows/integration_tests.yml` is the full-suite Cloud/Data Center integration workflow (nightly + manual).
- `.github/ai-context/releasing.md` links to the canonical AtlassianPS Standards release blueprint and keeps ConfluencePS-specific release details.
- Run local validation before opening/updating PRs when changing instruction files.
35 changes: 35 additions & 0 deletions .github/ai-context/releasing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Releasing ConfluencePS

ConfluencePS follows the canonical [AtlassianPS release blueprint](https://github.com/AtlassianPS/AtlassianPS.Standards/blob/master/docs/ReleaseBlueprint.md).
Keep cross-repository release strategy in the blueprint and keep this runbook limited to ConfluencePS-specific details.

## Files to Update

| File | What to Change |
|------|----------------|
| `CHANGELOG.md` | Add a release entry matching the tag: `## vX.Y.Z - YYYY-MM-DD` |
| `ConfluencePS/ConfluencePS.psd1` | Update `ModuleVersion` to `X.Y.Z` |

## Local Preflight

```powershell
Invoke-Build -Task Build, Test
Invoke-Build -Task Build, SetVersion -VersionToPublish vX.Y.Z
```

The release metadata preflight must find a matching changelog section before a tag is pushed.

## Release Flow

1. Start from an up-to-date `master` branch.
2. Update `CHANGELOG.md` and `ConfluencePS/ConfluencePS.psd1`.
3. Run the local preflight commands above.
4. Commit the release changes.
5. Create and push an annotated `vX.Y.Z` tag.

`release.yml` validates the annotated tag, downloads the `Release` artifact from CI for the tagged commit, builds release notes from `CHANGELOG.md`, publishes to PSGallery, creates the GitHub Release from the same release-notes file, and notifies the homepage repository for stable releases.

## Version Format

Use `vX.Y.Z` tags and `## vX.Y.Z - YYYY-MM-DD` changelog headings for future releases.
Pre-release tags may use suffixes such as `vX.Y.Z-beta`.
9 changes: 0 additions & 9 deletions .github/changelog.configuration.json

This file was deleted.

105 changes: 62 additions & 43 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,74 @@ concurrency:
on:
pull_request:
branches: [master]
paths-ignore:
&paths-ignore # Documentation (NOT docs/** - that's PlatyPS source!)
- "CHANGELOG.md"
- "LICENSE"
# AI assistant instruction files
- "AGENTS.md"
- "CLAUDE.md"
- "GEMINI.md"
- ".cursor/**"
- ".github/copilot-instructions.md"
- ".github/ai-context/**"
- ".github/instructions/**"
# GitHub/editor meta files
- ".github/*.md"
- ".github/ISSUE_TEMPLATE/**"
- ".github/PULL_REQUEST_TEMPLATE/**"
- ".vscode/**"
- ".editorconfig"
- ".spelling"
# Untracked regenerated docs (kept in case they ever land)
- "docs-regenerated/**"
push:
branches: [master]
paths-ignore: *paths-ignore
workflow_dispatch:

permissions:
contents: read
pull-requests: read

jobs:
changes:
name: Detect Changes
runs-on: ubuntu-latest
outputs:
run_ci: ${{ github.event_name == 'workflow_dispatch' || steps.filter.outputs.code == 'true' }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0

- id: filter
name: Decide whether full CI is required
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4
with:
base: ${{ github.ref }}
predicate-quantifier: every
filters: |
code:
- '**'
- '!.editorconfig'
- '!.github/copilot-instructions.md'
- '!.spelling'
- '!AGENTS.md'
- '!CHANGELOG.md'
- '!CLAUDE.md'
- '!GEMINI.md'
- '!LICENSE'
- '!.cursor/**'
- '!.github/*.md'
- '!.github/ai-context/**'
- '!.github/instructions/**'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/PULL_REQUEST_TEMPLATE/**'
- '!.vscode/**'
- '!docs-regenerated/**'

lint:
name: Lint
needs: changes
if: needs.changes.outputs.run_ci == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: rhysd/actionlint@914e7df21a07ef503a81201c76d2b11c789d3fca # v1.7.12
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- run: Invoke-Build -Task Lint
shell: pwsh

build:
name: Build Module
needs: lint
needs: [changes, lint]
if: needs.changes.outputs.run_ci == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- run: Invoke-Build -Task Clean, Build
- run: Invoke-Build -Task Clean, TestPublish
shell: pwsh

- uses: actions/upload-artifact@v7
Expand All @@ -62,16 +84,11 @@ jobs:

test_windows_ps5:
name: Test (Windows PS5)
needs: build
needs: [changes, build]
if: needs.changes.outputs.run_ci == 'true'
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
with:
ps-version: "5"
# Setup is run below in the powershell (PS 5.1) shell instead of pwsh,
# so the Windows PowerShell module path is populated.
skip-setup: "true"

- uses: actions/download-artifact@v8
with:
Expand All @@ -95,7 +112,8 @@ jobs:

test_pwsh:
name: Test (${{ matrix.name }})
needs: build
needs: [changes, build]
if: needs.changes.outputs.run_ci == 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand All @@ -106,14 +124,14 @@ jobs:
- { os: macos-latest, name: "macOS" }
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- uses: actions/download-artifact@v8
with:
name: Release
path: ./Release/

- run: Invoke-Build -Task Test -ExcludeTag "Integration", "Documentation"
- run: Invoke-Build -Task Test
shell: pwsh

- uses: actions/upload-artifact@v7
Expand All @@ -124,25 +142,26 @@ jobs:

smoke_tests:
name: Smoke Tests
needs: lint
needs: [changes, lint]
runs-on: ubuntu-latest
# Skip on fork PRs and Dependabot PRs: the shared cloud PAT secret is not exposed
# in those contexts and the smoke run would fail. The ci-required
# aggregator below treats skipped jobs as a pass, so fork PRs still get
# a green CI Result. First-party PRs and pushes to master gate on the
# smoke result, which in turn gates release.yml's artifact download
# (workflow_conclusion: success).
if: github.event_name != 'pull_request' ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.actor != 'dependabot[bot]')
if: needs.changes.outputs.run_ci == 'true' &&
(github.event_name != 'pull_request' ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.actor != 'dependabot[bot]'))
env:
CI_CONFLUENCE_TYPE: Cloud
CONFLUENCE_CLOUD_URL: ${{ vars.CONFLUENCE_CLOUD_URL }}
ATLASSIAN_CLOUD_USER: ${{ vars.ATLASSIAN_CLOUD_USER }}
ATLASSIAN_CLOUD_PAT: ${{ secrets.ATLASSIAN_CLOUD_PAT }}
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- name: Run smoke integration tests
run: |
Expand All @@ -159,7 +178,7 @@ jobs:
# Sentinel job that always runs and aggregates the result of the pipeline.
# Branch protection should require ONLY this check (`CI / CI Result`),
# not the individual jobs. That way a docs-only PR (where lint/build/test
# are skipped via paths-ignore) still produces a green required check
# are skipped by the Detect Changes job) still produces a green required check
# and can be merged. Smoke tests are part of the gate: they run on
# first-party PRs and on every push to master, and skip (without failing
# the gate) on fork/Dependabot PRs where secrets are not exposed.
Expand All @@ -168,7 +187,7 @@ jobs:
ci-required:
name: CI Result
if: always()
needs: [lint, build, test_windows_ps5, test_pwsh, smoke_tests]
needs: [changes, lint, build, test_windows_ps5, test_pwsh, smoke_tests]
runs-on: ubuntu-latest
steps:
- name: Aggregate job results
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/integration_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
ATLASSIAN_CLOUD_PAT: ${{ secrets.ATLASSIAN_CLOUD_PAT }}
steps:
- uses: actions/checkout@v6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- name: Run Cloud-tagged integration tests
run: |
Expand Down Expand Up @@ -68,7 +68,7 @@ jobs:
run: docker compose up -d
shell: bash

- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- name: Wait for Confluence to become reachable
run: ./Tools/Wait-ConfluenceServer.ps1 -TimeoutSeconds 1500
Expand Down
31 changes: 16 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,11 @@ jobs:
fetch-depth: 0
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || github.ref_name }}

- name: Resolve release ref
- name: Validate release tag
id: release_ref
shell: bash
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
release_tag="${{ inputs.release_tag }}"
else
release_tag="${{ github.ref_name }}"
fi

release_sha="$(git rev-list -n 1 "$release_tag")"
echo "release_tag=$release_tag" >> "$GITHUB_OUTPUT"
echo "release_sha=$release_sha" >> "$GITHUB_OUTPUT"
uses: AtlassianPS/AtlassianPS.Standards/.github/actions/resolve-release-tag@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11
with:
tag: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || github.ref_name }}

- name: Download artifact from tagged commit CI run
uses: dawidd6/action-download-artifact@v21
Expand All @@ -48,15 +40,24 @@ jobs:
path: ./Release/
if_no_artifact_found: fail

- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@9a9367e22847bd24f86208ed2d98d207b0e2a3b3 # v0.1.6
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/setup-powershell@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11

- run: Invoke-Build -Task Publish -VersionToPublish ${{ steps.release_ref.outputs.release_tag }}
-PSGalleryAPIKey ${{ secrets.PSGALLERY_API_KEY }}
- uses: AtlassianPS/AtlassianPS.Standards/.github/actions/build-release-notes@6fe5d05db84cdd10c9e4284e235a8f359c9537ad # v0.1.11
id: release_notes
with:
release-version: ${{ steps.release_ref.outputs.release_tag }}

- name: Publish module
run: |
Invoke-Build -Task Publish `
-VersionToPublish ${{ steps.release_ref.outputs.release_tag }} `
-PSGalleryAPIKey ${{ secrets.PSGALLERY_API_KEY }}
shell: pwsh

- name: Create Release and Upload Asset
uses: softprops/action-gh-release@v3
with:
body_path: ${{ steps.release_notes.outputs.release_notes_path }}
tag_name: ${{ steps.release_ref.outputs.release_tag }}
name: ${{ steps.release_ref.outputs.release_tag }}
files: ./Release/ConfluencePS.zip
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ Before merging: ensure the Windows PowerShell 5.1 CI test job is green.
- `.github/workflows/ci.yml` is the required PR/push quality gate.
- `.github/workflows/integration_tests.yml` runs full integration suites on a nightly schedule (Cloud + Dockerized Data Center) and manual dispatch.
- `.github/workflows/release.yml` publishes tagged releases.
- `.github/ai-context/releasing.md` keeps ConfluencePS-specific release steps and links to the canonical AtlassianPS Standards release blueprint.
- For instruction-only changes, run local validation before opening/updating a PR.

## Instruction Maintenance
Expand Down
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

- Fixed `-Label` parsing for the Get-ConfluencePage cmdlet (#193 [@claudiospizzi])

## [2.5] 2019-03-27
## v2.5.2 - 2026-05-30

### Changed

- Aligned release workflow, release-note generation, and publish-time manifest metadata with the AtlassianPS Standards release blueprint.

## v2.5.0 - 2019-03-27

### Added

Expand Down
Loading
Loading