Files
git.stella-ops.org/devops/scripts/test-package-publish.sh

182 lines
5.0 KiB
Bash

#!/bin/bash
# test-package-publish.sh - Test NuGet package publishing to local Gitea
# Sprint: SPRINT_20251226_004_CICD
#
# Prerequisites:
# - Docker running
# - Gitea test instance running (docker compose -f devops/compose/docker-compose.gitea-test.yaml up -d)
# - GITEA_TEST_TOKEN environment variable set
# - GITEA_TEST_OWNER environment variable set (default: stellaops)
#
# Usage:
# export GITEA_TEST_TOKEN="your-access-token"
# ./test-package-publish.sh # Test with sample package
# ./test-package-publish.sh --module Authority # Test specific module
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Configuration
GITEA_URL="${GITEA_TEST_URL:-http://localhost:3000}"
GITEA_OWNER="${GITEA_TEST_OWNER:-stellaops}"
GITEA_TOKEN="${GITEA_TEST_TOKEN:-}"
TEST_MODULE=""
DRY_RUN=false
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--module)
TEST_MODULE="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
--help)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --module MODULE Test specific module (e.g., Authority)"
echo " --dry-run Validate without pushing"
echo " --help Show this help message"
echo ""
echo "Environment Variables:"
echo " GITEA_TEST_URL Gitea URL (default: http://localhost:3000)"
echo " GITEA_TEST_OWNER Package owner (default: stellaops)"
echo " GITEA_TEST_TOKEN Access token with package:write scope"
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
echo "=== Package Publishing Test ==="
echo "Gitea URL: $GITEA_URL"
echo "Owner: $GITEA_OWNER"
echo "Dry Run: $DRY_RUN"
# Check prerequisites
if [[ -z "$GITEA_TOKEN" && "$DRY_RUN" == "false" ]]; then
echo -e "${RED}ERROR: GITEA_TEST_TOKEN environment variable is required${NC}"
echo "Generate a token at: $GITEA_URL/user/settings/applications"
exit 1
fi
# Check if Gitea is running
if ! curl -s "$GITEA_URL/api/healthz" >/dev/null 2>&1; then
echo -e "${YELLOW}WARNING: Gitea not reachable at $GITEA_URL${NC}"
echo "Start it with: docker compose -f devops/compose/docker-compose.gitea-test.yaml up -d"
if [[ "$DRY_RUN" == "false" ]]; then
exit 1
fi
fi
# NuGet source URL
NUGET_SOURCE="$GITEA_URL/api/packages/$GITEA_OWNER/nuget/index.json"
echo "NuGet Source: $NUGET_SOURCE"
echo ""
# Create a test package
TEST_DIR="$REPO_ROOT/out/package-test"
mkdir -p "$TEST_DIR"
# If no module specified, use a simple test
if [[ -z "$TEST_MODULE" ]]; then
echo "=== Creating Test Package ==="
# Create a minimal test package
TEST_PROJ_DIR="$TEST_DIR/StellaOps.PackageTest"
mkdir -p "$TEST_PROJ_DIR"
cat > "$TEST_PROJ_DIR/StellaOps.PackageTest.csproj" <<'EOF'
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<PackageId>StellaOps.PackageTest</PackageId>
<Version>0.0.1-test</Version>
<Authors>StellaOps</Authors>
<Description>Test package for registry validation</Description>
<PackageLicenseExpression>AGPL-3.0-or-later</PackageLicenseExpression>
</PropertyGroup>
</Project>
EOF
cat > "$TEST_PROJ_DIR/Class1.cs" <<'EOF'
namespace StellaOps.PackageTest;
public class TestClass { }
EOF
echo "Building test package..."
dotnet pack "$TEST_PROJ_DIR/StellaOps.PackageTest.csproj" -c Release -o "$TEST_DIR/packages"
PACKAGE_FILE=$(find "$TEST_DIR/packages" -name "*.nupkg" | head -1)
else
echo "=== Packing Module: $TEST_MODULE ==="
# Find the module's main project
MODULE_PROJ=$(find "$REPO_ROOT/src" -path "*/$TEST_MODULE/*" -name "StellaOps.$TEST_MODULE.csproj" | head -1)
if [[ -z "$MODULE_PROJ" ]]; then
echo -e "${RED}ERROR: Module project not found for $TEST_MODULE${NC}"
exit 1
fi
echo "Project: $MODULE_PROJ"
dotnet pack "$MODULE_PROJ" -c Release -p:Version=0.0.1-test -o "$TEST_DIR/packages"
PACKAGE_FILE=$(find "$TEST_DIR/packages" -name "*.nupkg" | head -1)
fi
if [[ -z "$PACKAGE_FILE" ]]; then
echo -e "${RED}ERROR: No package file created${NC}"
exit 1
fi
echo ""
echo "Package created: $PACKAGE_FILE"
echo ""
if [[ "$DRY_RUN" == "true" ]]; then
echo -e "${YELLOW}=== DRY RUN: Skipping push ===${NC}"
echo "Package validated successfully!"
echo ""
echo "To push manually:"
echo " dotnet nuget push \"$PACKAGE_FILE\" \\"
echo " --source $NUGET_SOURCE \\"
echo " --api-key YOUR_TOKEN"
else
echo "=== Pushing Package ==="
if dotnet nuget push "$PACKAGE_FILE" \
--source "$NUGET_SOURCE" \
--api-key "$GITEA_TOKEN" \
--skip-duplicate; then
echo ""
echo -e "${GREEN}SUCCESS: Package pushed to Gitea registry${NC}"
echo "View at: $GITEA_URL/$GITEA_OWNER/-/packages"
else
echo ""
echo -e "${RED}FAILED: Package push failed${NC}"
exit 1
fi
fi
echo ""
echo "=== Cleanup ==="
rm -rf "$TEST_DIR"
echo "Test directory cleaned up"
echo ""
echo -e "${GREEN}Done!${NC}"