feat(#344): Add Woodpecker CI pipeline monitoring to cli-tools

- Add ci-pipeline-status.sh for checking pipeline status
- Add ci-pipeline-logs.sh for fetching logs
- Add ci-pipeline-wait.sh for waiting on completion
- Update package.json bin section
- Update README with CI commands and examples

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 11:13:43 -06:00
parent bed440dc36
commit ec87c5479b
5 changed files with 414 additions and 5 deletions

View File

@@ -1,14 +1,19 @@
# @mosaic/cli-tools # @mosaic/cli-tools
CLI tools for Mosaic Stack orchestration - git operations that work with both Gitea and GitHub. CLI tools for Mosaic Stack orchestration - git operations and CI monitoring.
## Overview ## Overview
These scripts abstract the differences between `tea` (Gitea CLI) and `gh` (GitHub CLI), providing a unified interface for: These scripts provide unified interfaces for:
- Issue management (create, list, assign, close, comment) - **Git Operations**: Abstract differences between `tea` (Gitea CLI) and `gh` (GitHub CLI)
- Pull request management (create, list, merge, review) - Issue management (create, list, assign, close, comment)
- Milestone management (create, list, close) - Pull request management (create, list, merge, review)
- Milestone management (create, list, close)
- **CI Monitoring**: Woodpecker CI pipeline integration
- Pipeline status checking
- Log retrieval
- Automated waiting for completion
## Installation ## Installation
@@ -56,6 +61,14 @@ pnpm exec mosaic-issue-create -t "Title" -b "Body"
| `mosaic-milestone-list` | List milestones | | `mosaic-milestone-list` | List milestones |
| `mosaic-milestone-close` | Close a milestone | | `mosaic-milestone-close` | Close a milestone |
### CI/CD (Woodpecker)
| Command | Description |
| --------------------------- | ------------------------------------ |
| `mosaic-ci-pipeline-status` | Check pipeline status (latest or #N) |
| `mosaic-ci-pipeline-logs` | Fetch pipeline logs |
| `mosaic-ci-pipeline-wait` | Wait for pipeline completion |
## Usage Examples ## Usage Examples
### Create an issue with milestone ### Create an issue with milestone
@@ -90,6 +103,19 @@ mosaic-pr-create \
mosaic-pr-merge -n 42 -m squash -d mosaic-pr-merge -n 42 -m squash -d
``` ```
### Monitor CI pipeline
```bash
# Check latest pipeline status
mosaic-ci-pipeline-status --latest
# Wait for specific pipeline to complete
mosaic-ci-pipeline-wait -n 42
# Fetch logs on failure
mosaic-ci-pipeline-logs -n 42
```
## Platform Detection ## Platform Detection
The scripts automatically detect whether you're working with Gitea or GitHub by examining the git remote URL. No configuration needed. The scripts automatically detect whether you're working with Gitea or GitHub by examining the git remote URL. No configuration needed.
@@ -99,10 +125,19 @@ The scripts automatically detect whether you're working with Gitea or GitHub by
## Requirements ## Requirements
### Git Operations
- **Gitea**: `tea` CLI installed and authenticated - **Gitea**: `tea` CLI installed and authenticated
- **GitHub**: `gh` CLI installed and authenticated - **GitHub**: `gh` CLI installed and authenticated
- **Both**: `git` available in PATH - **Both**: `git` available in PATH
### CI Monitoring (Woodpecker)
- `woodpecker` CLI installed ([installation guide](https://woodpecker-ci.org/docs/usage/cli))
- Environment variables set:
- `WOODPECKER_SERVER` - Woodpecker server URL (e.g., `https://ci.mosaicstack.dev`)
- `WOODPECKER_TOKEN` - API token from Woodpecker UI (User → Access tokens)
## For Orchestrators ## For Orchestrators
When using these tools in orchestrator/worker contexts: When using these tools in orchestrator/worker contexts:

View File

@@ -0,0 +1,111 @@
#!/bin/bash
# ci-pipeline-logs.sh - Fetch Woodpecker CI pipeline logs
# Usage: ci-pipeline-logs.sh -n <pipeline_num> [-r <repo>] [-s <step>]
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/detect-platform.sh"
# Parse arguments
REPO=""
PIPELINE_NUM=""
STEP=""
show_help() {
cat << EOF
Usage: ci-pipeline-logs.sh [OPTIONS]
Fetch logs for a Woodpecker CI pipeline.
Options:
-n, --number <num> Pipeline number (required)
-r, --repo <owner/repo> Repository (default: auto-detect from git remote)
-s, --step <step> Specific step name/number
-h, --help Show this help
Environment:
WOODPECKER_SERVER Woodpecker server URL (required)
WOODPECKER_TOKEN Woodpecker API token (required)
Examples:
# Get all logs for pipeline 42
ci-pipeline-logs.sh -n 42
# Get logs for specific step
ci-pipeline-logs.sh -n 42 -s test
# Get logs for specific repo
ci-pipeline-logs.sh -r mosaic/stack -n 42
EOF
}
while [[ $# -gt 0 ]]; do
case $1 in
-r|--repo)
REPO="$2"
shift 2
;;
-n|--number)
PIPELINE_NUM="$2"
shift 2
;;
-s|--step)
STEP="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Validate required arguments
if [[ -z "$PIPELINE_NUM" ]]; then
echo "Error: Pipeline number is required (-n)"
show_help
exit 1
fi
# Check required environment variables
if [[ -z "$WOODPECKER_SERVER" ]]; then
echo "Error: WOODPECKER_SERVER environment variable not set"
exit 1
fi
if [[ -z "$WOODPECKER_TOKEN" ]]; then
echo "Error: WOODPECKER_TOKEN environment variable not set"
exit 1
fi
# Auto-detect repo if not provided
if [[ -z "$REPO" ]]; then
REPO=$(get_repo_info)
if [[ $? -ne 0 ]]; then
echo "Error: Could not auto-detect repository. Use -r option."
exit 1
fi
fi
# Check if woodpecker CLI is installed
if ! command -v woodpecker &> /dev/null; then
echo "Error: woodpecker CLI not found. Install it first:"
echo " Arch: paru -S woodpecker"
echo " Other: https://woodpecker-ci.org/docs/usage/cli"
exit 1
fi
# Get pipeline logs
if [[ -n "$STEP" ]]; then
# Get logs for specific step
woodpecker log show "$REPO" "$PIPELINE_NUM" "$STEP"
else
# Get all logs
woodpecker log show "$REPO" "$PIPELINE_NUM"
fi

View File

@@ -0,0 +1,108 @@
#!/bin/bash
# ci-pipeline-status.sh - Check Woodpecker CI pipeline status
# Usage: ci-pipeline-status.sh [-r <repo>] [-n <pipeline_num>] [--latest]
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/detect-platform.sh"
# Parse arguments
REPO=""
PIPELINE_NUM=""
LATEST=false
show_help() {
cat << EOF
Usage: ci-pipeline-status.sh [OPTIONS]
Check Woodpecker CI pipeline status for a repository.
Options:
-r, --repo <owner/repo> Repository (default: auto-detect from git remote)
-n, --number <num> Pipeline number
--latest Get status of latest pipeline
-h, --help Show this help
Environment:
WOODPECKER_SERVER Woodpecker server URL (required)
WOODPECKER_TOKEN Woodpecker API token (required)
Examples:
# Get latest pipeline status for current repo
ci-pipeline-status.sh --latest
# Get specific pipeline status
ci-pipeline-status.sh -n 42
# Get pipeline status for specific repo
ci-pipeline-status.sh -r mosaic/stack --latest
EOF
}
while [[ $# -gt 0 ]]; do
case $1 in
-r|--repo)
REPO="$2"
shift 2
;;
-n|--number)
PIPELINE_NUM="$2"
shift 2
;;
--latest)
LATEST=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Check required environment variables
if [[ -z "$WOODPECKER_SERVER" ]]; then
echo "Error: WOODPECKER_SERVER environment variable not set"
exit 1
fi
if [[ -z "$WOODPECKER_TOKEN" ]]; then
echo "Error: WOODPECKER_TOKEN environment variable not set"
exit 1
fi
# Auto-detect repo if not provided
if [[ -z "$REPO" ]]; then
REPO=$(get_repo_info)
if [[ $? -ne 0 ]]; then
echo "Error: Could not auto-detect repository. Use -r option."
exit 1
fi
fi
# Check if woodpecker CLI is installed
if ! command -v woodpecker &> /dev/null; then
echo "Error: woodpecker CLI not found. Install it first:"
echo " Arch: paru -S woodpecker"
echo " Other: https://woodpecker-ci.org/docs/usage/cli"
exit 1
fi
# Get pipeline status
if [[ "$LATEST" == true ]]; then
# Get latest pipeline
woodpecker pipeline ls "$REPO" --limit 1
elif [[ -n "$PIPELINE_NUM" ]]; then
# Get specific pipeline info
woodpecker pipeline info "$REPO" "$PIPELINE_NUM"
else
echo "Error: Either --latest or -n <number> is required"
show_help
exit 1
fi

View File

@@ -0,0 +1,152 @@
#!/bin/bash
# ci-pipeline-wait.sh - Wait for Woodpecker CI pipeline completion
# Usage: ci-pipeline-wait.sh -n <pipeline_num> [-r <repo>] [-t <timeout>]
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/detect-platform.sh"
# Parse arguments
REPO=""
PIPELINE_NUM=""
TIMEOUT=1800 # 30 minutes default
POLL_INTERVAL=10 # 10 seconds
show_help() {
cat << EOF
Usage: ci-pipeline-wait.sh [OPTIONS]
Wait for a Woodpecker CI pipeline to complete.
Options:
-n, --number <num> Pipeline number (required)
-r, --repo <owner/repo> Repository (default: auto-detect from git remote)
-t, --timeout <seconds> Timeout in seconds (default: 1800)
-i, --interval <seconds> Poll interval in seconds (default: 10)
-h, --help Show this help
Environment:
WOODPECKER_SERVER Woodpecker server URL (required)
WOODPECKER_TOKEN Woodpecker API token (required)
Exit codes:
0 - Pipeline succeeded
1 - Error or timeout
2 - Pipeline failed
3 - Pipeline killed/cancelled
Examples:
# Wait for pipeline 42 to complete
ci-pipeline-wait.sh -n 42
# Wait with custom timeout (10 minutes)
ci-pipeline-wait.sh -n 42 -t 600
EOF
}
while [[ $# -gt 0 ]]; do
case $1 in
-r|--repo)
REPO="$2"
shift 2
;;
-n|--number)
PIPELINE_NUM="$2"
shift 2
;;
-t|--timeout)
TIMEOUT="$2"
shift 2
;;
-i|--interval)
POLL_INTERVAL="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Validate required arguments
if [[ -z "$PIPELINE_NUM" ]]; then
echo "Error: Pipeline number is required (-n)"
show_help
exit 1
fi
# Check required environment variables
if [[ -z "$WOODPECKER_SERVER" ]]; then
echo "Error: WOODPECKER_SERVER environment variable not set"
exit 1
fi
if [[ -z "$WOODPECKER_TOKEN" ]]; then
echo "Error: WOODPECKER_TOKEN environment variable not set"
exit 1
fi
# Auto-detect repo if not provided
if [[ -z "$REPO" ]]; then
REPO=$(get_repo_info)
if [[ $? -ne 0 ]]; then
echo "Error: Could not auto-detect repository. Use -r option."
exit 1
fi
fi
# Check if woodpecker CLI is installed
if ! command -v woodpecker &> /dev/null; then
echo "Error: woodpecker CLI not found. Install it first:"
echo " Arch: paru -S woodpecker"
echo " Other: https://woodpecker-ci.org/docs/usage/cli"
exit 1
fi
echo "Waiting for pipeline #$PIPELINE_NUM in $REPO (timeout: ${TIMEOUT}s)..."
elapsed=0
while [[ $elapsed -lt $TIMEOUT ]]; do
# Get pipeline info
pipeline_info=$(woodpecker pipeline info "$REPO" "$PIPELINE_NUM" 2>&1)
# Extract status from output
# Woodpecker CLI outputs status in format like "STATUS: success"
if echo "$pipeline_info" | grep -q "success"; then
echo "✓ Pipeline succeeded"
exit 0
elif echo "$pipeline_info" | grep -q "failure\|error"; then
echo "✗ Pipeline failed"
echo ""
echo "$pipeline_info"
exit 2
elif echo "$pipeline_info" | grep -q "killed\|cancelled"; then
echo "✗ Pipeline was cancelled"
echo ""
echo "$pipeline_info"
exit 3
elif echo "$pipeline_info" | grep -q "pending\|running"; then
# Still running
echo -n "."
sleep "$POLL_INTERVAL"
elapsed=$((elapsed + POLL_INTERVAL))
else
# Unknown status, show info and continue
echo ""
echo "Unknown status, continuing to wait..."
echo "$pipeline_info"
sleep "$POLL_INTERVAL"
elapsed=$((elapsed + POLL_INTERVAL))
fi
done
echo ""
echo "✗ Timeout after ${TIMEOUT}s"
exit 1

View File

@@ -4,6 +4,9 @@
"description": "CLI tools for Mosaic Stack orchestration - git operations for Gitea/GitHub", "description": "CLI tools for Mosaic Stack orchestration - git operations for Gitea/GitHub",
"private": true, "private": true,
"bin": { "bin": {
"mosaic-ci-pipeline-logs": "./bin/ci-pipeline-logs.sh",
"mosaic-ci-pipeline-status": "./bin/ci-pipeline-status.sh",
"mosaic-ci-pipeline-wait": "./bin/ci-pipeline-wait.sh",
"mosaic-detect-platform": "./bin/detect-platform.sh", "mosaic-detect-platform": "./bin/detect-platform.sh",
"mosaic-issue-assign": "./bin/issue-assign.sh", "mosaic-issue-assign": "./bin/issue-assign.sh",
"mosaic-issue-close": "./bin/issue-close.sh", "mosaic-issue-close": "./bin/issue-close.sh",