name: Update version.json from Release on: release: types: [published, edited] permissions: contents: write jobs: update-version-json: name: Update version.json with release information runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Extract version from tag id: version run: | TAG_NAME="${{ github.event.release.tag_name }}" VERSION_ONLY="${TAG_NAME#v}" echo "TAG_NAME=${TAG_NAME}" >> $GITHUB_OUTPUT echo "VERSION_ONLY=${VERSION_ONLY}" >> $GITHUB_OUTPUT # Extract date from tag if available (format: v1.2.3-20251113-abc) if [[ "${TAG_NAME}" =~ -([0-9]{8})- ]]; then DATE_STR="${BASH_REMATCH[1]}" BUILD_DATE_ISO="${DATE_STR:0:4}-${DATE_STR:4:2}-${DATE_STR:6:2}" else # Use release published date BUILD_DATE_ISO=$(echo "${{ github.event.release.published_at }}" | cut -d'T' -f1) fi echo "BUILD_DATE_ISO=${BUILD_DATE_ISO}" >> $GITHUB_OUTPUT - name: Install jq run: sudo apt-get update && sudo apt-get install -y jq - name: Get release information id: release_info run: | # Use jq to properly escape JSON RELEASE_BODY="${{ github.event.release.body }}" RELEASE_NAME="${{ github.event.release.name }}" # Handle empty values if [ -z "$RELEASE_BODY" ]; then RELEASE_BODY="" fi if [ -z "$RELEASE_NAME" ]; then RELEASE_NAME="" fi # Save to temporary files for proper handling echo -n "$RELEASE_BODY" > /tmp/release_body.txt echo -n "$RELEASE_NAME" > /tmp/release_name.txt # Use jq to escape JSON strings RELEASE_BODY_JSON=$(jq -Rs . < /tmp/release_body.txt) RELEASE_NAME_JSON=$(jq -Rs . < /tmp/release_name.txt) echo "RELEASE_BODY=${RELEASE_BODY_JSON}" >> $GITHUB_OUTPUT echo "RELEASE_NAME=${RELEASE_NAME_JSON}" >> $GITHUB_OUTPUT - name: Download current version.json from server id: download_version continue-on-error: true run: | # Try to download current version.json from server curl -f -s "https://version.crossdesk.cn/version.json" -o version.json || echo "Failed to download, will create new one" - name: Generate or update version.json run: | # If version.json exists, try to preserve downloads section if [ -f version.json ] && jq -e '.downloads' version.json > /dev/null 2>&1; then EXISTING_DOWNLOADS=$(jq -c '.downloads' version.json) if [ "$EXISTING_DOWNLOADS" != "null" ] && [ "$EXISTING_DOWNLOADS" != "{}" ]; then DOWNLOADS_JSON="$EXISTING_DOWNLOADS" else DOWNLOADS_JSON="" fi else DOWNLOADS_JSON="" fi # If downloads is empty, use default structure if [ -z "$DOWNLOADS_JSON" ]; then DOWNLOADS_JSON=$(cat << DOWNLOADS_EOF { "windows-x64": { "url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe", "filename": "crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe" }, "macos-x64": { "url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg", "filename": "crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg" }, "macos-arm64": { "url": "https://downloads.crossdesk.cn/crossdesk-macos-arm64-${{ steps.version.outputs.TAG_NAME }}.pkg", "filename": "crossdesk-macos-arm64-${{ steps.version.outputs.TAG_NAME }}.pkg" }, "linux-amd64": { "url": "https://downloads.crossdesk.cn/crossdesk-linux-amd64-${{ steps.version.outputs.TAG_NAME }}.deb", "filename": "crossdesk-linux-amd64-${{ steps.version.outputs.TAG_NAME }}.deb" }, "linux-arm64": { "url": "https://downloads.crossdesk.cn/crossdesk-linux-arm64-${{ steps.version.outputs.TAG_NAME }}.deb", "filename": "crossdesk-linux-arm64-${{ steps.version.outputs.TAG_NAME }}.deb" } } DOWNLOADS_EOF ) fi # Generate version.json using cat and heredoc cat > version.json << EOF { "version": "${{ steps.version.outputs.VERSION_ONLY }}", "releaseDate": "${{ steps.version.outputs.BUILD_DATE_ISO }}", "releaseName": ${{ steps.release_info.outputs.RELEASE_NAME }}, "releaseNotes": ${{ steps.release_info.outputs.RELEASE_BODY }}, "tagName": "${{ steps.version.outputs.TAG_NAME }}", "downloads": ${DOWNLOADS_JSON} } EOF cat version.json - name: Upload version.json to server uses: burnett01/rsync-deployments@5.2 with: switches: -avzr --delete path: version.json remote_path: /var/www/html/version/ remote_host: ${{ secrets.SERVER_HOST }} remote_user: ${{ secrets.SERVER_USER }} remote_key: ${{ secrets.SERVER_KEY }}