Skip to content

🚀 [Feature]: Unified CI and Release Workflow #196

@MariusStorhaug

Description

@MariusStorhaug

User Scenarios & Testing (mandatory)

Primary User Story

As a PowerShell module maintainer managing multiple repositories, I need a single workflow configuration that handles both continuous integration testing on pull requests and automated release publishing on merges to the main branch. This eliminates the maintenance burden of keeping two separate workflow files (CI.yml and workflow.yml) synchronized across all my module repositories, reducing configuration complexity and the risk of inconsistencies.

Acceptance Scenarios

  1. Given a pull request is opened or updated, When the workflow runs, Then it executes all CI validation steps (tests, linting, build verification) without triggering any release or publishing actions
  2. Given a pull request is merged to the main branch, When the workflow runs, Then it executes the full release pipeline including version bumping, changelog generation, artifact publishing, and release creation
  3. Given a developer pushes directly to a feature branch, When the workflow runs, Then it only performs CI validation appropriate for that branch without release steps
  4. Given the workflow is triggered manually, When a maintainer runs it with specific inputs, Then it provides options to control which validation or release steps to execute
  5. Given a workflow file already exists in a repository, When I update to the unified workflow, Then all existing CI and release behaviors are preserved with identical or improved functionality

Edge Cases

  • What happens when a PR merge fails CI validation after the merge commit is created?
  • How does the system handle a release pipeline failure halfway through (e.g., changelog generated but publishing failed)?
  • What occurs if version calculation logic determines no version bump is needed?
  • How does the workflow behave on repository forks where release permissions may not be available?
  • What happens when required secrets or permissions are missing for release steps?
  • How does the workflow handle simultaneous merges to main that could conflict during release?

Requirements (mandatory)

Functional Requirements

ID Requirement
FR-001 Workflow MUST detect the triggering event type (pull request, push to main, manual dispatch) and execute appropriate job sets
FR-002 Workflow MUST run all CI validation steps (build, test, lint) on pull request events
FR-003 Workflow MUST run full CI validation plus release pipeline on merge to main branch
FR-004 Workflow MUST prevent release steps from executing on pull requests or non-main branches
FR-005 Workflow MUST support reusable configuration that can be referenced from multiple repositories
FR-006 Workflow MUST maintain all existing CI validation behaviors from the current CI.yml file
FR-007 Workflow MUST maintain all existing release automation behaviors from the current workflow.yml file
FR-008 Workflow MUST provide clear status reporting distinguishing between CI failures and release failures
FR-009 Workflow MUST allow manual workflow dispatch with configurable inputs for testing and troubleshooting
FR-010 Workflow MUST handle conditional job execution based on context (PR vs merge vs manual)
FR-011 Workflow MUST support skipping specific validation or release steps based on commit messages or labels

Non-Functional Requirements

ID Requirement
NFR-001 Workflow MUST complete CI validation within the same time bounds as the current separate CI.yml file
NFR-002 Workflow MUST be maintainable from a single file location reducing configuration drift across repositories
NFR-003 Workflow MUST provide clear, actionable error messages when jobs fail
NFR-004 Workflow MUST minimize redundant job execution between CI and release phases
NFR-005 Workflow configuration MUST be readable and understandable by other maintainers
NFR-006 Workflow MUST use consistent job naming and output conventions across all execution paths

Quality Attributes Addressed

Attribute Target Metric
Maintainability Single source of truth reduces maintenance by 50% (1 file vs 2 files)
Reliability Identical CI/release behavior preservation - zero regression in automation coverage
Consistency Uniform workflow behavior across all module repositories in the framework
Efficiency No additional CI execution time - maintain current performance characteristics
Clarity Clear separation of CI and release concerns within unified structure

Constraints

Constraint Description
GitHub Actions Must work within GitHub Actions workflow syntax and execution model
Backward Compatibility Must support existing repository structures without requiring other changes
Secret Management Must work with existing repository secrets and organization-level secrets
PowerShell 7.4+ Must be compatible with existing composite actions that use PowerShell 7.4+

Key Entities

Entity Description
Workflow Trigger Represents the event that initiates the workflow (pull_request, push, workflow_dispatch), determining execution path
CI Job Set Collection of validation steps (build, test, lint, analysis) that run on all trigger types
Release Job Set Collection of publishing steps (version bump, changelog, artifact upload, release creation) that only run on main branch merges
Job Condition Logic that evaluates workflow context to determine whether a specific job should execute
Workflow Configuration Single YAML file containing all job definitions, triggers, and conditional logic

Feature Branch: 001-merge-workflows
Created: 2025-10-02
Status: Specification Complete

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions