name: Deploy on: workflow_call: inputs: prerelease: description: 'Mark as prerelease' required: false type: boolean default: false permissions: contents: write jobs: build-and-release: runs-on: ubuntu-latest steps: - name: Clone repository with submodules run: | git config --global --remove-section http || true git config --global --unset-all core.askPass || true TOKEN="${{ secrets.BUILD_TOKEN }}" git clone --recurse-submodules \ -c credential.helper="" \ https://token:$TOKEN@git.datadunia.com/nexusguard/Nexus-Guard-Suite.git . - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.25' - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '24' - name: Build Server Core run: | cd apps/server-core go build -o bin/server-core . - name: Build Device Agent Cross-platform run: | cd apps/device-agent # Linux amd64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/nexus-device-agent-linux-amd64 . # Linux arm64 CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o bin/nexus-device-agent-linux-arm64 . # Windows amd64 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/nexus-device-agent-windows-amd64.exe . - name: Build Dashboard UI run: | cd apps/dashboard-ui npm ci || npm install npm run build - name: Generate latest.json run: | VERSION="${{ gitea.ref_name }}" RELEASE_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" REPO="${{ gitea.repository }}" SERVER="${{ gitea.server_url }}" cat > latest.json << ENDJSON { "version": "$VERSION", "release_date": "$RELEASE_DATE", "download_urls": { "server-core": "${SERVER}/${REPO}/releases/download/${VERSION}/server-core-linux-amd64", "device-agent-linux-amd64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-linux-amd64", "device-agent-linux-arm64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-linux-arm64", "device-agent-windows-amd64": "${SERVER}/${REPO}/releases/download/${VERSION}/nexus-device-agent-windows-amd64.exe", "dashboard-ui": "${SERVER}/${REPO}/releases/download/${VERSION}/dashboard-ui-dist.zip" } } ENDJSON - name: Create Release and upload assets env: TOKEN: ${{ secrets.BUILD_TOKEN }} run: | if [ -z "$TOKEN" ]; then echo "Value: [EMPTY]" exit 1 else echo "Length: ${#TOKEN} characters" fi REPO="${{ gitea.repository }}" TAG="${{ gitea.ref_name }}" API="${{ gitea.server_url }}/api/v1" # 0. Check & Delete Existing Release echo "=== 0. Check & Delete Existing Release ===" EXISTING_RESP=$(curl -s -H "Authorization: token $TOKEN" "$API/repos/$REPO/releases/tags/$TAG") EXISTING_ID=$(echo "$EXISTING_RESP" | grep -o '"id":[0-9]*' | head -n 1 | cut -d':' -f2 || true) if [ -n "$EXISTING_ID" ] && [ "$EXISTING_ID" != "null" ]; then echo "⚠️ Found existing release for tag $TAG with ID: $EXISTING_ID. Deleting..." DELETE_RESP=$(curl -s -w "\n%{http_code}" -X DELETE -H "Authorization: token $TOKEN" "$API/repos/$REPO/releases/$EXISTING_ID") echo "✅ Delete response: $DELETE_RESP" else echo "No existing release found for $TAG. Proceeding..." fi # 1. Create Release echo "=== 1. Create New Release ===" JSON_BODY=$(printf '{"tag_name":"%s","name":"%s","body":"Release %s","draft":false,"prerelease":%s}' "$TAG" "$TAG" "$TAG" "${{ inputs.prerelease }}") RELEASE_RESP=$(curl -s -X POST \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d "$JSON_BODY" \ "$API/repos/$REPO/releases") # Ambil ID dengan lebih teliti # Tambahkan || true agar grep tidak membuat script crash (karena set -e) jika id tidak ditemukan RELEASE_ID=$(echo "$RELEASE_RESP" | grep -o '"id":[0-9]*' | head -n 1 | cut -d':' -f2 || true) if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then echo "Gagal membuat release. Response: $RELEASE_RESP" exit 1 fi echo "Release ID: $RELEASE_ID" # 2. Upload Assets # Server Core if [ -f "apps/server-core/bin/server-core" ]; then echo "Uploading server-core-linux-amd64..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@apps/server-core/bin/server-core" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=server-core-linux-amd64" fi # Device Agent Linux amd64 if [ -f "apps/device-agent/bin/nexus-device-agent-linux-amd64" ]; then echo "Uploading nexus-device-agent-linux-amd64..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@apps/device-agent/bin/nexus-device-agent-linux-amd64" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-linux-amd64" fi # Device Agent Linux arm64 if [ -f "apps/device-agent/bin/nexus-device-agent-linux-arm64" ]; then echo "Uploading nexus-device-agent-linux-arm64..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@apps/device-agent/bin/nexus-device-agent-linux-arm64" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-linux-arm64" fi # Device Agent Windows amd64 if [ -f "apps/device-agent/bin/nexus-device-agent-windows-amd64.exe" ]; then echo "Uploading nexus-device-agent-windows-amd64.exe..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@apps/device-agent/bin/nexus-device-agent-windows-amd64.exe" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=nexus-device-agent-windows-amd64.exe" fi # Dashboard UI dist if [ -d "apps/dashboard-ui/dist" ]; then echo "Creating dashboard-ui-dist.zip..." cd apps/dashboard-ui zip -r ../dashboard-ui-dist.zip dist/ cd .. echo "Uploading dashboard-ui-dist.zip..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@dashboard-ui-dist.zip" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=dashboard-ui-dist.zip" fi # latest.json if [ -f "latest.json" ]; then echo "Uploading latest.json..." curl -s -X POST \ -H "Authorization: token $TOKEN" \ -F "attachment=@latest.json" \ "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=latest.json" fi - name: Cleanup build artifacts if: always() run: | git config --global --remove-section http || true git config --global --unset-all core.askPass || true rm -f latest.json dashboard-ui-dist.zip rm -rf apps/server-core/bin apps/device-agent/bin apps/dashboard-ui/node_modules apps/dashboard-ui/dist echo "Cleanup done"