133 lines
4.9 KiB
YAML
133 lines
4.9 KiB
YAML
# .woodpecker.yml – monorepo .NET z poprawną kolejnością budowania
|
||
|
||
when:
|
||
event: [push, tag, manual]
|
||
branch: [master]
|
||
|
||
steps:
|
||
restore:
|
||
image: mcr.microsoft.com/dotnet/sdk:latest
|
||
commands:
|
||
- dotnet restore
|
||
|
||
test:
|
||
image: mcr.microsoft.com/dotnet/sdk:latest
|
||
commands:
|
||
- dotnet test --no-restore --configuration Release --logger "trx"
|
||
|
||
build-and-pack-datamodels:
|
||
image: mcr.microsoft.com/dotnet/sdk:latest
|
||
commands:
|
||
- |
|
||
set -euo pipefail
|
||
|
||
# Odczytujemy typy projektów w solution (zakładamy, że każdy ma <ProjectType> w csproj)
|
||
echo "=== Wykrywanie projektów DataModel ==="
|
||
|
||
LOCAL_NUGET="/tmp/local-nuget"
|
||
mkdir -p "$LOCAL_NUGET"
|
||
|
||
for csproj in *.csproj; do
|
||
[ -f "$csproj" ] || continue
|
||
|
||
PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown")
|
||
|
||
if [[ "$PROJECT_TYPE" == "DataModel" ]]; then
|
||
PROJECT_NAME=$(basename "$csproj" .csproj)
|
||
echo "→ Pakuję DataModel: $PROJECT_NAME"
|
||
|
||
dotnet pack "$csproj" --no-build --configuration Release -o "$LOCAL_NUGET"
|
||
|
||
echo " Pakiet zapisany w $LOCAL_NUGET"
|
||
fi
|
||
done
|
||
|
||
# Dodajemy lokalny folder jako źródło NuGet dla kolejnych kroków
|
||
dotnet nuget add source "$LOCAL_NUGET" --name local-temp-nuget
|
||
|
||
echo "Lokalne źródło NuGet dodane: $LOCAL_NUGET"
|
||
ls -la "$LOCAL_NUGET"
|
||
|
||
deploy:
|
||
image: mcr.microsoft.com/dotnet/sdk:latest
|
||
environment:
|
||
BAGET_API_KEY:
|
||
from_secret: baget_api_key
|
||
BAGET_URL:
|
||
from_secret: baget_url
|
||
DEPLOY_SSH_KEY:
|
||
from_secret: deploy_ssh_key
|
||
commands:
|
||
- |
|
||
set -euo pipefail
|
||
|
||
echo "=== Informacje o projekcie (monorepo) ==="
|
||
echo "Repo: ${CI_REPO_NAME}"
|
||
echo "Commit: ${CI_COMMIT_SHA:0:8}"
|
||
echo "Branch/Tag: ${CI_COMMIT_REF}"
|
||
|
||
# Publikujemy wszystkie projekty (oprócz DataModel – one już spakowane)
|
||
LOCAL_NUGET="/tmp/local-nuget"
|
||
|
||
for csproj in *.csproj; do
|
||
[ -f "$csproj" ] || continue
|
||
|
||
PROJECT_TYPE=$(dotnet msbuild "$csproj" -getProperty:ProjectType -noLogo 2>/dev/null || echo "Unknown")
|
||
DEPLOY_TO_CENTRAL=$(dotnet msbuild "$csproj" -getProperty:DeployToCentral -noLogo 2>/dev/null || echo "false")
|
||
|
||
case "$PROJECT_TYPE" in
|
||
DataModel)
|
||
# Opcjonalnie: publikuj do BaGet na koniec (po udanym buildzie całego solution)
|
||
if [[ -n "${BAGET_URL:-}" ]]; then
|
||
echo "→ Publikacja $PROJECT_TYPE do BaGet"
|
||
for pkg in "$LOCAL_NUGET"/*.nupkg; do
|
||
if [[ "$pkg" == *$(basename "$csproj" .csproj)* ]]; then
|
||
dotnet nuget push "$pkg" --api-key "$BAGET_API_KEY" --source "$BAGET_URL" --skip-duplicate
|
||
fi
|
||
done
|
||
fi
|
||
;;
|
||
|
||
ConsoleApp|Api|Blazor)
|
||
if [[ "$DEPLOY_TO_CENTRAL" != "true" ]]; then
|
||
echo "Projekt $PROJECT_TYPE: DeployToCentral=false – pomijam"
|
||
continue
|
||
fi
|
||
|
||
echo "→ Publikacja $PROJECT_TYPE"
|
||
|
||
PUBLISH_ARGS="-c Release -o /tmp/publish-$(basename "$csproj" .csproj)"
|
||
|
||
if [[ "$PROJECT_TYPE" == "ConsoleApp" ]]; then
|
||
RID=$(dotnet msbuild "$csproj" -getProperty:RuntimeIdentifier -noLogo || echo "linux-x64")
|
||
SELF_CONTAINED=$(dotnet msbuild "$csproj" -getProperty:SelfContained -noLogo || echo "true")
|
||
SINGLE_FILE=$(dotnet msbuild "$csproj" -getProperty:PublishSingleFile -noLogo || echo "true")
|
||
PUBLISH_ARGS="$PUBLISH_ARGS --self-contained $SELF_CONTAINED -r $RID -p:PublishSingleFile=$SINGLE_FILE"
|
||
else
|
||
TRIMMED=$(dotnet msbuild "$csproj" -getProperty:PublishTrimmed -noLogo || echo "true")
|
||
PUBLISH_ARGS="$PUBLISH_ARGS -p:PublishTrimmed=$TRIMMED"
|
||
fi
|
||
|
||
dotnet publish "$csproj" --no-restore $PUBLISH_ARGS
|
||
|
||
# Deploy via SSH
|
||
mkdir -p ~/.ssh
|
||
echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_rsa
|
||
chmod 600 ~/.ssh/id_rsa
|
||
ssh-keyscan -H localhost >> ~/.ssh/known_hosts 2>/dev/null
|
||
|
||
TARGET_DIR="/opt/deployment/$PROJECT_TYPE/${CI_REPO_NAME}-$(basename "$csproj" .csproj)"
|
||
rsync -avz --delete "/tmp/publish-$(basename "$csproj" .csproj)/" " $(whoami)@localhost:$TARGET_DIR/"
|
||
|
||
ssh "$(whoami)@localhost" "find '$TARGET_DIR' -type f \\( -name '*.dll' -o -name '*.exe' -o -perm /111 \\) -exec chmod +x {} \\; || true"
|
||
|
||
echo "Deploy $PROJECT_TYPE zakończony → $TARGET_DIR"
|
||
;;
|
||
|
||
*)
|
||
echo "Projekt $(basename "$csproj") – nieznany typ ($PROJECT_TYPE), pomijam"
|
||
;;
|
||
esac
|
||
done
|
||
|
||
echo "Cały pipeline monorepo zakończony pomyślnie." |