182 lines
5.0 KiB
Bash
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}"
|