azure-pipelines-generator Pass

Comprehensive toolkit for generating best practice Azure DevOps Pipelines following current standards and conventions. Use this skill when creating new Azure Pipelines, implementing CI/CD workflows, or building deployment pipelines.

64
stars
35
downloads
79
views

// Install Skill

Install Skill

Skills are third-party code from public GitHub repositories. SkillHub scans for known malicious patterns but cannot guarantee safety. Review the source code before installing.

Install globally (user-level):

npx skillhub install akin-ozer/cc-devops-skills/azure-pipelines-generator

Install in current project:

npx skillhub install akin-ozer/cc-devops-skills/azure-pipelines-generator --project

skill.install.customTargetHelp

npx skillhub install akin-ozer/cc-devops-skills/azure-pipelines-generator --target-dir /path/to/skills

Suggested path: ~/.claude/skills/azure-pipelines-generator/

SKILL.md Content

---
name: azure-pipelines-generator
description: Comprehensive toolkit for generating best practice Azure DevOps Pipelines following current standards and conventions. Use this skill when creating new Azure Pipelines, implementing CI/CD workflows, or building deployment pipelines.
---

# Azure Pipelines Generator

## Overview

Generate production-ready Azure DevOps Pipeline configurations following current best practices, security standards, and naming conventions. All generated resources are automatically validated using the devops-skills:azure-pipelines-validator skill to ensure syntax correctness and compliance with best practices.

## Core Capabilities

### 1. Generate Basic CI Pipelines

Create simple continuous integration pipelines for building and testing applications.

**When to use:**
- User requests: "Create an Azure Pipeline for...", "Build a CI pipeline...", "Generate Azure DevOps pipeline..."
- Scenarios: Continuous integration, automated builds, automated testing

**Process:**
1. Understand the user's requirements (language, framework, testing needs)
2. Identify triggers, pool/agent requirements, and build steps
3. Reference `docs/yaml-schema.md` for YAML structure
4. Reference `docs/best-practices.md` for implementation patterns
5. Reference `docs/tasks-reference.md` for common tasks
6. Generate the pipeline following these principles:
   - Use specific vmImage versions (not 'latest')
   - Pin task versions to major versions (e.g., `@2`)
   - Use displayName for all stages, jobs, and important steps
   - Implement caching for package managers
   - Add proper test result publishing
   - Use conditions appropriately
   - Set reasonable timeouts
7. **ALWAYS validate** the generated pipeline using the devops-skills:azure-pipelines-validator skill
8. If validation fails, fix the issues and re-validate

**Example structure:**
```yaml
trigger:
  branches:
    include:
    - main
    - develop

pool:
  vmImage: 'ubuntu-22.04'

variables:
  buildConfiguration: 'Release'

steps:
- task: NodeTool@0
  displayName: 'Install Node.js'
  inputs:
    versionSpec: '20.x'

- task: Cache@2
  displayName: 'Cache npm packages'
  inputs:
    key: 'npm | "$(Agent.OS)" | package-lock.json'
    path: $(Pipeline.Workspace)/.npm

- script: npm ci --cache $(Pipeline.Workspace)/.npm
  displayName: 'Install dependencies'

- script: npm run build
  displayName: 'Build application'

- script: npm test
  displayName: 'Run tests'

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/test-results.xml'
```

### 2. Generate Multi-Stage CI/CD Pipelines

Create complex pipelines with multiple stages for build, test, and deployment.

**When to use:**
- User requests: "Create a full CI/CD pipeline...", "Build multi-stage pipeline...", "Deploy to multiple environments..."
- Scenarios: Complete CI/CD workflows, multi-environment deployments, complex build processes

**Process:**
1. Identify all stages needed (Build, Test, Deploy)
2. Determine stage dependencies and conditions
3. Plan deployment strategies and environments
4. Use `docs/yaml-schema.md` for stage/job/step hierarchy
5. Reference `examples/multi-stage-cicd.yml` for patterns
6. Generate pipeline with:
   - Clear stage organization
   - Proper `dependsOn` relationships
   - Deployment jobs for environment tracking
   - Conditions for branch-specific deployments
   - Artifact management between stages
7. **ALWAYS validate** using devops-skills:azure-pipelines-validator skill

**Example:**
```yaml
stages:
- stage: Build
  displayName: 'Build Stage'
  jobs:
  - job: BuildJob
    displayName: 'Build Application'
    pool:
      vmImage: 'ubuntu-22.04'
    steps:
    - script: npm run build
      displayName: 'Build'
    - publish: $(Build.SourcesDirectory)/dist
      artifact: drop

- stage: Test
  displayName: 'Test Stage'
  dependsOn: Build
  jobs:
  - job: TestJob
    displayName: 'Run Tests'
    steps:
    - script: npm test
      displayName: 'Test'

- stage: DeployProd
  displayName: 'Deploy to Production'
  dependsOn: Test
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  jobs:
  - deployment: DeployProd
    environment: production
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo "Deploying"
```

### 3. Generate Docker Build Pipelines

Create pipelines for building and pushing Docker images to container registries.

**When to use:**
- User requests: "Build Docker image...", "Push to container registry...", "Create Docker pipeline..."
- Scenarios: Container builds, registry pushes, multi-stage Docker builds

**Process:**
1. Identify Docker registry (ACR, Docker Hub, etc.)
2. Determine image naming and tagging strategy
3. Plan for security scanning if needed
4. Reference `docs/tasks-reference.md` for Docker@2 task
5. Reference `examples/kubernetes-deploy.yml` for Docker build patterns
6. Generate pipeline with:
   - Docker@2 task for build and push
   - Service connection for registry authentication
   - Proper image tagging (build ID, latest, semantic version)
   - Optional security scanning with Trivy or similar
7. **ALWAYS validate** using devops-skills:azure-pipelines-validator skill

**Example:**
```yaml
variables:
  dockerRegistryServiceConnection: 'myACR'
  imageRepository: 'myapp'
  containerRegistry: 'myregistry.azurecr.io'
  tag: '$(Build.BuildId)'

steps:
- task: Docker@2
  displayName: 'Build and Push'
  inputs:
    command: buildAndPush
    repository: $(imageRepository)
    dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
    containerRegistry: $(dockerRegistryServiceConnection)
    tags: |
      $(tag)
      latest
```

### 4. Generate Kubernetes Deployment Pipelines

Create pipelines that deploy applications to Kubernetes clusters.

**When to use:**
- User requests: "Deploy to Kubernetes...", "Create K8s deployment pipeline...", "Deploy to AKS..."
- Scenarios: Kubernetes deployments, AKS deployments, manifest deployments

**Process:**
1. Identify Kubernetes deployment method (kubectl, Helm, manifests)
2. Determine cluster connection details
3. Plan namespace and environment strategy
4. Reference `docs/tasks-reference.md` for Kubernetes tasks
5. Reference `examples/kubernetes-deploy.yml` for patterns
6. Generate pipeline with:
   - KubernetesManifest@0 or Kubernetes@1 tasks
   - Service connection for cluster authentication
   - Proper namespace management
   - Rollout status checking
   - Health check validation
7. **ALWAYS validate** using devops-skills:azure-pipelines-validator skill

**Example:**
```yaml
- task: KubernetesManifest@0
  displayName: 'Deploy to Kubernetes'
  inputs:
    action: 'deploy'
    kubernetesServiceConnection: 'myK8sCluster'
    namespace: 'production'
    manifests: |
      k8s/deployment.yml
      k8s/service.yml
    containers: '$(containerRegistry)/$(imageRepository):$(tag)'
```

### 5. Generate Language-Specific Pipelines

Create pipelines optimized for specific programming languages and frameworks.

**Supported Languages:**
- **.NET/C#**: DotNetCoreCLI@2 tasks, NuGet restore, test, publish
- **Node.js**: NodeTool@0, Npm@1 tasks, npm ci, build, test
- **Python**: UsePythonVersion@0, pip install, pytest
- **Java**: Maven@3 or Gradle@2 tasks
- **Go**: GoTool@0 for version management, go build/test commands, module caching
- **Docker**: Multi-stage builds, layer caching

**Process:**
1. Identify the programming language and framework
2. Reference `docs/tasks-reference.md` for language-specific tasks
3. Reference language-specific examples (dotnet-cicd.yml, python-cicd.yml, go-cicd.yml)
4. Generate pipeline with:
   - Language/runtime setup tasks
   - Package manager caching
   - Build commands specific to framework
   - Test execution with proper reporting
   - Artifact publishing
5. **ALWAYS validate** using devops-skills:azure-pipelines-validator skill

#### Go Language Pipeline Details

**Tasks for Go:**
- **GoTool@0**: Install specific Go version (note: @0 is the current/only major version)
- **Cache@2**: Cache Go modules from `$(GOPATH)/pkg/mod`
- **Script steps**: For `go build`, `go test`, `go vet`, `go mod download`

**Go Module Caching Pattern:**
```yaml
- task: Cache@2
  displayName: 'Cache Go modules'
  inputs:
    key: 'go | "$(Agent.OS)" | go.sum'
    restoreKeys: |
      go | "$(Agent.OS)"
    path: $(GOPATH)/pkg/mod
```

**Go Build Commands:**
```yaml
# Download dependencies
- script: go mod download
  displayName: 'Download Go modules'

# Run linting/vetting
- script: go vet ./...
  displayName: 'Run Go vet'

# Run tests with coverage
- script: go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
  displayName: 'Run Go tests with coverage'

# Build for Linux (common for containers)
- script: |
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o $(Build.ArtifactStagingDirectory)/app ./cmd/server
  displayName: 'Build Go binary for Linux'
```

**Go Matrix Testing Example:**
```yaml
strategy:
  matrix:
    go121:
      goVersion: '1.21'
    go122:
      goVersion: '1.22'
  maxParallel: 2

steps:
- task: GoTool@0
  displayName: 'Install Go $(goVersion)'
  inputs:
    version: $(goVersion)

- script: go test -v ./...
  displayName: 'Run tests'
```

**Reference:** See `examples/go-cicd.yml` for a complete Go CI/CD pipeline example.

### 6. Generate Template-Based Pipelines

Create reusable templates and pipelines that use them.

**When to use:**
- User requests: "Create reusable template...", "Use templates for...", "Build modular pipeline..."
- Scenarios: Template libraries, DRY configurations, shared CI/CD logic

**Process:**
1. Identify common patterns to extract
2. Design template parameters
3. Reference `docs/templates-guide.md` for template syntax
4. Reference `examples/templates/` for template patterns
5. Generate templates with:
   - Clear parameter definitions with types and defaults
   - Documentation comments
   - Proper parameter usage with ${{ }} syntax
   - Conditional logic and iteration as needed
6. Generate main pipeline that uses templates
7. **ALWAYS validate** both templates and main pipeline

**Example:**
```yaml
# Template: templates/build.yml
parameters:
- name: nodeVersion
  type: string
  default: '20.x'

steps:
- task: NodeTool@0
  inputs:
    versionSpec: ${{ parameters.nodeVersion }}
- script: npm ci
- script: npm run build

# Main pipeline
steps:
- template: templates/build.yml
  parameters:
    nodeVersion: '20.x'
```

### 7. Handling Azure Pipelines Tasks and Documentation Lookup

When generating pipelines that use specific Azure Pipelines tasks or require latest documentation:

**Detection:**
- User mentions specific tasks (e.g., "DotNetCoreCLI", "Docker", "AzureWebApp")
- User requests integration with Azure services
- Pipeline requires specific Azure DevOps features

**Process:**

1. **ALWAYS check local documentation first (REQUIRED):**
   Local docs are sufficient for most common tasks and should be your primary reference:
   - `docs/tasks-reference.md` - Contains .NET, Node.js, Python, Go, Docker, Kubernetes, Azure tasks
   - `docs/yaml-schema.md` - Complete YAML syntax reference
   - `docs/best-practices.md` - Security, performance, naming patterns

   **Most pipelines can be generated using only local docs.** External lookup is only needed for:
   - Tasks not documented locally (rare Azure services, third-party marketplace tasks)
   - Specific version compatibility questions
   - Troubleshooting specific error messages

2. **Read relevant example files (RECOMMENDED):**
   Before generating, read the example file(s) that match the user's request:
   - Go pipeline? → Read `examples/go-cicd.yml`
   - Docker/K8s? → Read `examples/kubernetes-deploy.yml`
   - Multi-stage? → Read `examples/multi-stage-cicd.yml`
   - Templates? → Read `examples/template-usage.yml`

   This ensures consistent patterns and best practices.

3. **For tasks NOT in local docs, use external sources:**

   **Option A - Context7 MCP (Preferred when available):**
   - Try to resolve library ID using `mcp__context7__resolve-library-id`
   - Query: "azure-pipelines" or "azure-devops"
   - Fetch documentation using `mcp__context7__get-library-docs`
   - Context7 provides structured, version-aware documentation
   - Best for: Complex tasks, multiple input options, detailed examples

   **Option B - WebSearch (Fallback or for specific queries):**
   ```
   Search query pattern: "[TaskName] Azure Pipelines task documentation"
   Examples:
   - "AzureWebApp@1 Azure Pipelines task documentation"
   - "KubernetesManifest@0 Azure Pipelines task inputs"
   - "Docker@2 Azure Pipelines task latest version"
   ```
   - Best for: Quick lookups, specific version info, troubleshooting

   **When to use which:**
   - Use Context7 first for comprehensive task documentation
   - Use WebSearch when Context7 lacks the specific task, for troubleshooting, or for quick version checks
   - Either approach is acceptable - the goal is accurate, up-to-date information

4. **Analyze documentation for:**
   - Task name and version (e.g., `Docker@2`)
   - Required vs optional inputs
   - Input types and valid values
   - Task outputs if any
   - Best practices and examples
   - Service connection requirements

5. **Generate pipeline using discovered information:**
   - Use correct task name and version
   - Include all required inputs
   - Use appropriate input types
   - Add comments explaining task purpose
   - Include service connections where needed

6. **Include helpful comments:**
   ```yaml
   # Docker@2: Build and push Docker images to a container registry
   # Requires: Docker registry service connection
   - task: Docker@2
     displayName: 'Build and Push Docker image'
     inputs:
       command: buildAndPush
       repository: myapp
       dockerfile: Dockerfile
       containerRegistry: myDockerRegistry
   ```

**Example with task documentation lookup:**
```yaml
# Task: AzureFunctionApp@1
# Purpose: Deploy to Azure Functions
# Service Connection: Azure Resource Manager
- task: AzureFunctionApp@1
  displayName: 'Deploy Azure Function'
  inputs:
    azureSubscription: 'AzureServiceConnection'  # Required: ARM service connection
    appType: 'functionAppLinux'                  # Linux function app
    appName: 'myfunctionapp'                     # Function app name
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'  # Deployment package
    runtimeStack: 'NODE|20'                      # Node.js 20 runtime
```

## Validation Workflow

**CRITICAL:** Every generated Azure Pipeline configuration MUST be validated before presenting to the user.

### Validation Process

1. **After generating any pipeline configuration**, immediately invoke the `devops-skills:azure-pipelines-validator` skill:
   ```
   Skill: devops-skills:azure-pipelines-validator
   ```

2. **The devops-skills:azure-pipelines-validator skill will:**
   - Validate YAML syntax
   - Check Azure Pipelines schema compliance
   - Verify task names and versions
   - Check for best practices violations
   - Perform security scanning (hardcoded secrets, etc.)
   - Report any errors, warnings, or suggestions

3. **If validation fails:**
   - Analyze the reported errors
   - Fix the issues in the generated configuration
   - Re-validate until all checks pass

4. **If validation succeeds:**
   - Present the validated configuration to the user
   - Mention that validation was successful
   - Provide usage instructions

### When to Skip Validation

Only skip validation when:
- Generating partial code snippets (not complete files)
- Creating examples for documentation purposes
- User explicitly requests to skip validation

## Best Practices to Enforce

Reference `docs/best-practices.md` for comprehensive guidelines. Key principles:

### Mandatory Standards

1. **Security First:**
   - Never hardcode secrets or credentials
   - Use service connections for external services
   - Mark sensitive variables as secret in Azure DevOps
   - Use specific vmImage versions (not 'latest')
   - **Docker image tagging strategy:**
     - When **pushing** images: Use build-specific tag as primary (e.g., `$(Build.BuildId)`), optionally add `:latest` for convenience
     - When **pulling/deploying** images: Always use specific tags, never pull `:latest` in production deployments
     - Example: Push with `$(tag)` AND `latest`, but deploy using `$(containerRegistry)/$(imageRepository):$(tag)`

2. **Version Pinning:**
   - Use specific vmImage versions: `ubuntu-22.04` not `ubuntu-latest`
   - Pin tasks to major versions: `Docker@2` not `Docker@0`
   - Specify language/runtime versions: `'20.x'` for Node.js
   - **Note on @0 versions:** Some tasks only have @0 as their current/latest major version (e.g., `GoTool@0`, `NodeTool@0`, `KubernetesManifest@0`). Using @0 for these tasks is correct and acceptable - the goal is to use the latest available major version, not to avoid @0 specifically.

3. **Performance:**
   - Implement caching for package managers (Cache@2 task)
   - Use explicit `dependsOn` for parallel execution
   - Set artifact expiration
   - Use shallow clone when full history not needed
   - Optimize matrix strategies

4. **Naming:**
   - Stages: PascalCase (e.g., `BuildAndTest`, `DeployProduction`)
   - Jobs: PascalCase (e.g., `BuildJob`, `TestJob`)
   - displayName: Sentence case (e.g., `'Build application'`, `'Run tests'`)
   - Variables: camelCase or snake_case (be consistent)

5. **Organization:**
   - Use stages for complex pipelines
   - Use deployment jobs for environment tracking
   - Use templates for reusable logic
   - Use variable groups for environment-specific variables
   - Add comments for complex logic

6. **Error Handling:**
   - Set timeoutInMinutes for long-running jobs
   - Use conditions appropriately (succeeded(), failed(), always())
   - Use continueOnError for non-critical steps
   - Publish test results with `condition: succeededOrFailed()`

7. **Testing:**
   - Always publish test results (PublishTestResults@2)
   - Publish code coverage (PublishCodeCoverageResults@1)
   - Run linting as separate job or step
   - Include security scanning for dependencies

## Resources

### Documentation (Load as Needed)

- `docs/yaml-schema.md` - Complete Azure Pipelines YAML syntax reference
  - Pipeline structure, stages, jobs, steps
  - Triggers, pools, variables, parameters
  - Conditions and expressions
  - **Use this:** For YAML syntax and structure

- `docs/tasks-reference.md` - Common Azure Pipelines tasks catalog
  - .NET, Node.js, Python, Docker, Kubernetes tasks
  - Task inputs, outputs, and examples
  - Service connection requirements
  - **Use this:** When selecting which task to use

- `docs/best-practices.md` - Azure Pipelines best practices
  - Security patterns, performance optimization
  - Pipeline design, error handling
  - Common patterns and anti-patterns
  - **Use this:** When implementing any pipeline

- `docs/templates-guide.md` - Templates and reusability guide
  - Template types (step, job, stage, variable)
  - Parameter definitions and usage
  - Template expressions and iteration
  - **Use this:** For creating reusable templates

### Examples (Reference for Patterns)

**IMPORTANT:** When generating pipelines, **explicitly read** the relevant example files to ensure consistent patterns and best practices. Use the Read tool to load these files before generating.

| Example File | When to Read |
|-------------|--------------|
| `examples/basic-ci.yml` | Simple CI pipelines, single-stage builds |
| `examples/multi-stage-cicd.yml` | Multi-environment deployments, complex workflows |
| `examples/kubernetes-deploy.yml` | Docker + K8s deployments, container builds |
| `examples/go-cicd.yml` | Go/Golang applications |
| `examples/dotnet-cicd.yml` | .NET/C# applications |
| `examples/python-cicd.yml` | Python applications |
| `examples/template-usage.yml` | Template-based pipelines |
| `examples/templates/build-template.yml` | Creating reusable build templates |
| `examples/templates/deploy-template.yml` | Creating reusable deployment templates |

**Example reading workflow:**
```
1. User requests: "Create a Go CI/CD pipeline with Docker"
2. Read: examples/go-cicd.yml (for Go patterns)
3. Read: examples/kubernetes-deploy.yml (for Docker/K8s patterns)
4. Generate pipeline combining both patterns
5. Validate with devops-skills:azure-pipelines-validator skill
```

## Typical Workflow Example

**User request:** "Create a CI/CD pipeline for a Node.js app with Docker deployment to AKS"

**Process:**
1. ✅ Understand requirements:
   - Node.js application
   - Build and test code
   - Build Docker image
   - Push to container registry
   - Deploy to Azure Kubernetes Service
   - Multiple environments (staging, production)

2. ✅ Reference resources:
   - Check `docs/yaml-schema.md` for multi-stage structure
   - Check `docs/tasks-reference.md` for NodeTool, Docker, Kubernetes tasks
   - Check `docs/best-practices.md` for pipeline patterns
   - Review `examples/multi-stage-cicd.yml` and `examples/kubernetes-deploy.yml`

3. ✅ Search for latest task documentation:
   - WebSearch: "Docker@2 Azure Pipelines task"
   - WebSearch: "KubernetesManifest@0 Azure Pipelines"
   - Context7 (if available): Query azure-pipelines library

4. ✅ Generate pipeline:
   - Stage 1: Build Node.js application
     - NodeTool@0 for Node.js setup
     - npm ci with caching
     - npm run build and test
     - Publish test results
   - Stage 2: Build Docker image
     - Docker@2 buildAndPush
     - Tag with Build.BuildId and latest
   - Stage 3: Deploy to AKS
     - Deployment job with environment
     - KubernetesManifest@0 for deployment
     - Health check validation

5. ✅ Validate:
   - Invoke `devops-skills:azure-pipelines-validator` skill
   - Fix any reported issues
   - Re-validate if needed

6. ✅ Present to user:
   - Show validated pipeline
   - Explain each stage
   - Provide setup instructions (service connections, environments)
   - Mention successful validation

## Common Pipeline Patterns

### Basic Three-Stage Pattern
```yaml
stages:
- stage: Build
  jobs:
  - job: BuildJob
    steps:
    - script: echo "Building"

- stage: Test
  dependsOn: Build
  jobs:
  - job: TestJob
    steps:
    - script: echo "Testing"

- stage: Deploy
  dependsOn: Test
  jobs:
  - deployment: DeployJob
    environment: production
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo "Deploying"
```

### Matrix Testing Pattern
```yaml
strategy:
  matrix:
    node18:
      nodeVersion: '18.x'
    node20:
      nodeVersion: '20.x'
    node22:
      nodeVersion: '22.x'
  maxParallel: 3

steps:
- task: NodeTool@0
  inputs:
    versionSpec: $(nodeVersion)
- script: npm test
```

### Conditional Deployment Pattern
```yaml
- stage: DeployProd
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  jobs:
  - deployment: DeployProd
    environment: production
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo "Deploy"
```

## Error Messages and Troubleshooting

### If devops-skills:azure-pipelines-validator reports errors:

1. **Syntax errors:** Fix YAML formatting, indentation, or structure
2. **Task version errors:** Ensure tasks use proper version format (TaskName@version)
3. **Pool/vmImage errors:** Use specific vmImage versions, not 'latest'
4. **Stage/Job errors:** Verify stages contain jobs, jobs contain steps
5. **Security warnings:** Address hardcoded secrets, :latest tags

### If documentation for specific task is not found:

1. Try alternative search queries
2. Check Microsoft Learn directly: https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/
3. Check GitHub: https://github.com/microsoft/azure-pipelines-tasks
4. Ask user if they have specific task version requirements

## Summary

Always follow this sequence when generating Azure Pipelines:

1. **Understand** - Clarify user requirements, language, deployment targets
2. **Reference** - Check docs/yaml-schema.md, tasks-reference.md, best-practices.md
3. **Search** - For specific tasks, use WebSearch or Context7 for current docs
4. **Generate** - Follow standards (pinning, caching, naming, stages)
5. **Validate** - ALWAYS use devops-skills:azure-pipelines-validator skill
6. **Fix** - Resolve any validation errors
7. **Present** - Deliver validated, production-ready pipeline

Generate Azure Pipelines that are:
- ✅ Secure with proper secrets management and version pinning
- ✅ Following current best practices and conventions
- ✅ Using proper YAML structure and hierarchy
- ✅ Optimized for performance (caching, parallelization)
- ✅ Well-documented with displayName and comments
- ✅ Validated and compliant
- ✅ Production-ready and maintainable

License

Declared license: Apache-2.0

The full license text is available in the source repository.

View the license in the source repositorythe version published there is authoritative.