stages: - build - publish # Only create pipelines automatically when a Git tag is pushed. # Otherwise the pipeline must be started manually (pipeline "Run" / dispatch equivalent). workflow: rules: - if: '$CI_COMMIT_TAG' when: always - if: '$CI_PIPELINE_SOURCE == "web"' when: always - when: never variables: DOTNET_CLI_TELEMETRY_OPTOUT: "1" DOTNET_SKIP_FIRST_TIME_EXPERIENCE: "1" BUILD_CONFIG: "Release" # Build job for Windows runner (shell executor). Remove 'image' so the runner uses the host environment. build_windows: stage: build tags: - shared-windows script: - dotnet --info - dotnet restore - dotnet build "imagecatalog\ImageCatalog 2.csproj" -c $BUILD_CONFIG -v minimal artifacts: paths: - "**/bin/$BUILD_CONFIG/net10.0-windows/**" expire_in: 1 hour # Publish and create GitLab Release when building a tag. This job expects a Windows runner with PowerShell and curl available. publish_release: stage: publish tags: - shared-windows needs: - build_windows script: # Publish the app - dotnet publish "imagecatalog\ImageCatalog 2.csproj" -c $BUILD_CONFIG -r win-x64 --self-contained false -o publish - echo "Published to $(pwd)\\publish" # Find first file in publish folder - $file = Get-ChildItem -Path publish -File | Select-Object -First 1; Write-Host "Uploading $($file.FullName)" # Upload to GitLab project uploads API to get a public URL for the artifact - $uploadUrl = "$env:CI_API_V4_URL/projects/$env:CI_PROJECT_ID/uploads" - $formData = "file=@$($file.FullName)" - $uploadResp = curl --silent --show-error --header "JOB-TOKEN:$env:CI_JOB_TOKEN" --form $formData $uploadUrl - $uploadJson = $uploadResp | ConvertFrom-Json - $assetUrl = "$env:CI_SERVER_URL$($uploadJson.url)" - 'Write-Host "Uploaded asset url: $assetUrl"' # Create the release using uploads URL - $body = @{ name = $env:CI_COMMIT_TAG; tag_name = $env:CI_COMMIT_TAG; description = "Automated release from CI"; assets = @{ links = @(@{ name = "$($file.Name)"; url = $assetUrl }) } } | ConvertTo-Json -Depth 10 - Invoke-RestMethod -Method Post -Uri "$env:CI_API_V4_URL/projects/$env:CI_PROJECT_ID/releases" -Headers @{ "JOB-TOKEN" = $env:CI_JOB_TOKEN } -Body $body -ContentType "application/json" artifacts: paths: - publish/* expire_in: 1 day only: - tags # Notes for runner setup: Ensure a GitLab Windows runner with tag 'windows' is registered and has .NET 10 SDK installed. # Use the shell executor on the Windows machine so the job runs in the host PowerShell environment