Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions .github/workflows/nuget-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: NuGet Publish

on:
push:
branches:
- master
pull_request:
branches:
- master

jobs:
build:
name: Build & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'

- name: Restore
run: dotnet restore src/NativeWebSocket/NativeWebSocket.csproj

- name: Build
run: dotnet build src/NativeWebSocket/NativeWebSocket.csproj -c Release --no-restore

publish:
name: Publish to NuGet
runs-on: ubuntu-latest
needs: [build]
# TODO: revert to: if: github.event_name == 'push' && github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'

- name: Check for version change
id: version
run: |
CURRENT=$(grep '<Version>' src/NativeWebSocket/NativeWebSocket.csproj | sed 's/.*<Version>\(.*\)<\/Version>.*/\1/')
PREVIOUS=$(git show HEAD~1:src/NativeWebSocket/NativeWebSocket.csproj 2>/dev/null | grep '<Version>' | sed 's/.*<Version>\(.*\)<\/Version>.*/\1/' || echo "")
echo "current=$CURRENT" >> $GITHUB_OUTPUT
echo "previous=$PREVIOUS" >> $GITHUB_OUTPUT
if [ "$CURRENT" != "$PREVIOUS" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
echo "Version changed: $PREVIOUS -> $CURRENT"
else
echo "changed=false" >> $GITHUB_OUTPUT
echo "Version unchanged: $CURRENT"
fi

- name: Pack NativeWebSocket
# TODO: revert to: if: steps.version.outputs.changed == 'true'
run: dotnet pack src/NativeWebSocket/NativeWebSocket.csproj -c Release -o packages/

- name: Pack NativeWebSocket.MonoGame
# TODO: revert to: if: steps.version.outputs.changed == 'true'
run: dotnet pack integrations/MonoGame/NativeWebSocket.MonoGame.csproj -c Release -o packages/

- name: Publish to NuGet
# TODO: revert to: if: steps.version.outputs.changed == 'true'
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
run: dotnet nuget push packages/*.nupkg --api-key "$NUGET_API_KEY" --source https://api.nuget.org/v3/index.json --skip-duplicate
232 changes: 232 additions & 0 deletions .github/workflows/unity-upm-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
name: Unity UPM Release

on:
push:
branches:
- master
pull_request:
branches:
- master

jobs:
checkSemver:
name: Check for Semver Change
runs-on: ubuntu-latest
outputs:
semver-updated: ${{ steps.check.outputs.changed }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
- uses: EndBug/version-check@v1
id: check
with:
file-name: integrations/Unity/package.json
diff-search: true
token: ${{ secrets.GITHUB_TOKEN }}
- name: Log when changed
if: steps.check.outputs.changed == 'true'
run: 'echo "Version change found in commit ${{ steps.check.outputs.commit }}! New version: ${{ steps.check.outputs.version }} (${{ steps.check.outputs.type }})"'

updateUPM:
name: Update UPM branch
runs-on: ubuntu-latest
needs: [checkSemver]
if: needs.checkSemver.outputs.semver-updated == 'true'
steps:
- uses: actions/checkout@v4

- name: Assemble UPM package
run: |
mkdir -p upm-package/WebSocket

# Core library files (single source of truth)
cp src/NativeWebSocket/IWebSocket.cs upm-package/WebSocket/
cp src/NativeWebSocket/WebSocketTypes.cs upm-package/WebSocket/

# Wrap core WebSocket.cs with Unity conditional compilation guard
{ echo '#if !UNITY_WEBGL || UNITY_EDITOR'; echo ''; cat src/NativeWebSocket/WebSocket.cs; echo ''; echo '#endif'; } > upm-package/WebSocket/WebSocket.cs

# Unity-specific files (WebGL platform support)
cp integrations/Unity/WebSocketWebGL.cs upm-package/WebSocket/
cp integrations/Unity/WebSocketFactoryWebGL.cs upm-package/WebSocket/
cp integrations/Unity/WebSocket.jslib upm-package/WebSocket/
cp integrations/Unity/WebSocket.jspre upm-package/WebSocket/
cp integrations/Unity/endel.nativewebsocket.asmdef upm-package/WebSocket/

# Package metadata and samples
cp integrations/Unity/package.json upm-package/
cp -r integrations/Unity/Samples~ upm-package/

- name: Push package directory to subtree
uses: s0/git-publish-subdir-action@develop
env:
REPO: self
BRANCH: upm-2.0
FOLDER: upm-package/
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

createPackage:
name: Create Unity Package and Release
runs-on: ubuntu-latest
needs: [checkSemver]
if: needs.checkSemver.outputs.semver-updated == 'true'
steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Assemble package directory
run: |
mkdir -p upm-package/Assets/WebSocket

# Core library files
cp src/NativeWebSocket/IWebSocket.cs upm-package/Assets/WebSocket/
cp src/NativeWebSocket/WebSocketTypes.cs upm-package/Assets/WebSocket/

# Wrap core WebSocket.cs with Unity conditional compilation guard
{ echo '#if !UNITY_WEBGL || UNITY_EDITOR'; echo ''; cat src/NativeWebSocket/WebSocket.cs; echo ''; echo '#endif'; } > upm-package/Assets/WebSocket/WebSocket.cs

# Unity-specific files
cp integrations/Unity/WebSocketWebGL.cs upm-package/Assets/WebSocket/
cp integrations/Unity/WebSocketFactoryWebGL.cs upm-package/Assets/WebSocket/
cp integrations/Unity/WebSocket.jslib upm-package/Assets/WebSocket/
cp integrations/Unity/WebSocket.jspre upm-package/Assets/WebSocket/
cp integrations/Unity/endel.nativewebsocket.asmdef upm-package/Assets/WebSocket/

# Package metadata
cp integrations/Unity/package.json upm-package/Assets/

- name: Generate .meta files
run: |
generate_meta() {
local file="$1"
local guid
guid=$(echo -n "$file" | md5sum | cut -c1-32)
local ext="${file##*.}"
local meta="${file}.meta"

case "$ext" in
cs)
cat > "$meta" <<ENDMETA
fileFormatVersion: 2
guid: ${guid}
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
ENDMETA
;;
jslib|jspre)
cat > "$meta" <<ENDMETA
fileFormatVersion: 2
guid: ${guid}
PluginImporter:
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:
ENDMETA
;;
*)
cat > "$meta" <<ENDMETA
fileFormatVersion: 2
guid: ${guid}
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
ENDMETA
;;
esac
}

# Generate .meta for the WebSocket folder
folder_guid=$(echo -n "Assets/WebSocket" | md5sum | cut -c1-32)
cat > upm-package/Assets/WebSocket.meta <<ENDMETA
fileFormatVersion: 2
guid: ${folder_guid}
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
ENDMETA

# Generate .meta for package.json
generate_meta "upm-package/Assets/package.json"

# Generate .meta for each file in WebSocket/
for f in upm-package/Assets/WebSocket/*; do
generate_meta "$f"
done

- name: Gather meta files
run: |
cd upm-package
find Assets -name '*.meta' > ../metaList
cat ../metaList

- name: Extract Version
id: version
uses: notiz-dev/github-action-json-property@release
with:
path: 'integrations/Unity/package.json'
prop_path: 'version'
- run: echo ${{steps.version.outputs.prop}}

- name: Generate Unity Package
id: build-package
uses: pCYSl5EDgo/create-unitypackage@master
with:
package-path: 'NativeWebSocket.unitypackage'
include-files: metaList
project-folder: upm-package

- name: Upload Package
uses: actions/upload-artifact@v4
with:
path: ./NativeWebSocket.unitypackage
name: NativeWebSocket

- name: Changelog
uses: scottbrenner/generate-changelog-action@master
id: Changelog

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.version.outputs.prop }}
release_name: ${{ steps.version.outputs.prop }}
body: |
${{ steps.Changelog.outputs.changelog }}
draft: false
prerelease: true

- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./NativeWebSocket.unitypackage
asset_name: NativeWebSocket.unitypackage
asset_content_type: application/x-gzip
Loading
Loading