2dust/v2rayN

6 workflows · maturity 33% · 3 patterns · GitHub ↗

Security 4.17/100

Practices

✓ Matrix✓ Permissions○ Security scan○ AI review○ Cache○ Concurrency○ Reusable workflows

Detected patterns

Security dimensions

permissions
4.2
security scan
0
supply chain
0
secret handling
0
harden runner
0

Workflows (6)

build-all .github/workflows/build-all.yml
Triggers
workflow_dispatch
Runs on
ubuntu-latest
Jobs
update
Commands
  • curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows.yml/dispatches \ -d "{ \"ref\": \"master\", \"inputs\": { \"release_tag\": \"${{ github.event.inputs.release_tag }}\" } }"
  • curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-linux.yml/dispatches \ -d "{ \"ref\": \"master\", \"inputs\": { \"release_tag\": \"${{ github.event.inputs.release_tag }}\" } }"
  • curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-osx.yml/dispatches \ -d "{ \"ref\": \"master\", \"inputs\": { \"release_tag\": \"${{ github.event.inputs.release_tag }}\" } }"
  • curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows-desktop.yml/dispatches \ -d "{ \"ref\": \"master\", \"inputs\": { \"release_tag\": \"${{ github.event.inputs.release_tag }}\" } }"
View raw YAML
name: release all platforms

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string

jobs:
  update:
    runs-on: ubuntu-latest
    steps:

      - name: Trigger build windows
        if: github.event.inputs.release_tag != ''
        run: |
          curl -X POST \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows.yml/dispatches \
            -d "{
              \"ref\": \"master\",
              \"inputs\": {
                \"release_tag\": \"${{ github.event.inputs.release_tag }}\"
              }
            }"

      - name: Trigger build linux
        if: github.event.inputs.release_tag != ''
        run: |
          curl -X POST \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-linux.yml/dispatches \
            -d "{
              \"ref\": \"master\",
              \"inputs\": {
                \"release_tag\": \"${{ github.event.inputs.release_tag }}\"
              }
            }"

      - name: Trigger build osx
        if: github.event.inputs.release_tag != ''
        run: |
          curl -X POST \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-osx.yml/dispatches \
            -d "{
              \"ref\": \"master\",
              \"inputs\": {
                \"release_tag\": \"${{ github.event.inputs.release_tag }}\"
              }
            }"

      - name: Trigger build windows desktop
        if: github.event.inputs.release_tag != ''
        run: |
          curl -X POST \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-windows-desktop.yml/dispatches \
            -d "{
              \"ref\": \"master\",
              \"inputs\": {
                \"release_tag\": \"${{ github.event.inputs.release_tag }}\"
              }
            }"
build-linux matrix perms .github/workflows/build-linux.yml
Triggers
workflow_dispatch, push
Runs on
ubuntu-24.04, ubuntu-24.04, ubuntu-24.04
Jobs
build, deb, rpm
Matrix
configuration→ Release
Actions
svenstaro/upload-release-action, svenstaro/upload-release-action, svenstaro/upload-release-action
Commands
  • cd v2rayN dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64 -p:SelfContained=true -o "$OutputPath64" dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 -p:SelfContained=true -o "$OutputPathArm64" dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-x64 -p:SelfContained=true -p:PublishTrimmed=true -o "$OutputPath64" dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-arm64 -p:SelfContained=true -p:PublishTrimmed=true -o "$OutputPathArm64"
  • chmod 755 package-release-zip.sh ./package-release-zip.sh "$OutputArch" "$OutputPath64" ./package-release-zip.sh "$OutputArchArm" "$OutputPathArm64"
  • set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file \ ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev \ libc6 libgcc-s1 libstdc++6 zlib1g libicu-dev libssl-dev
  • chmod 755 package-debian.sh
  • ./package-debian.sh "${RELEASE_TAG}" --arch all
  • mkdir -p "$GITHUB_WORKSPACE/dist/deb" rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb/" || true find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_amd64.deb" \ -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-64.deb" \; || true find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_arm64.deb" \ -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-arm64.deb" \; || true echo "==== Dist tree ====" ls -R "$GITHUB_WORKSPACE/dist/deb" || true
  • set -euo pipefail . /etc/os-release EL_MAJOR="${VERSION_ID%%.*}" echo "EL_MAJOR=${EL_MAJOR}" dnf -y makecache || true command -v curl >/dev/null || dnf -y install curl ca-certificates ARCH="$(uname -m)" case "$ARCH" in x86_64|aarch64) ;; *) echo "Unsupported arch: $ARCH"; exit 1 ;; esac install_epel_from_dir() { local base="$1" rpm echo "Try: $base" rpm="$( { curl -fsSL "$base/Packages/" 2>/dev/null curl -fsSL "$base/Packages/e/" 2>/dev/null | sed 's|href="|href="e/|' } | sed -n 's/.*href="\([^"]*epel-release-[^"]*\.noarch\.rpm\)".*/\1/p' | sort -V | tail -n1 )" || true if [[ -n "$rpm" ]]; then dnf -y install "$base/Packages/$rpm" return 0 fi return 1 } FEDORA="https://dl.fedoraproject.org/pub/epel/epel-release-latest-${EL_MAJOR}.noarch.rpm" echo "Try Fedora: $FEDORA" if curl -fsSLI "$FEDORA" >/dev/null; then dnf -y install "$FEDORA" else ROCKY="https://dl.rockylinux.org/pub/rocky/${EL_MAJOR}/extras/${ARCH}/os" if install_epel_from_dir "$ROCKY"; then : else ALMA="https://repo.almalinux.org/almalinux/${EL_MAJOR}/extras/${ARCH}/os" if install_epel_from_dir "$ALMA"; then : else echo "EPEL bootstrap failed (Fedora/Rocky/Alma)" exit 1 fi fi fi dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core \ rsync findutils tar gzip unzip which dnf repolist | grep -i epel || true
  • chmod 755 package-rhel.sh
View raw YAML
name: release Linux

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string
  push:
    branches:
      - master

permissions:
  contents: write

env:
  OutputArch: "linux-64"
  OutputArchArm: "linux-arm64"
  OutputPath64:  "${{ github.workspace }}/v2rayN/Release/linux-64"
  OutputPathArm64:  "${{ github.workspace }}/v2rayN/Release/linux-arm64"

jobs:
  build:
    strategy:
      matrix:
        configuration: [Release]
    runs-on: ubuntu-24.04

    steps:
    - name: Checkout
      uses: actions/checkout@v6.0.2
      with:
        submodules: 'recursive'
        fetch-depth: '0'

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

    - name: Build
      run: |
        cd v2rayN
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64   -p:SelfContained=true -o "$OutputPath64"
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 -p:SelfContained=true -o "$OutputPathArm64"
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r linux-x64   -p:SelfContained=true -p:PublishTrimmed=true -o "$OutputPath64"
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r linux-arm64 -p:SelfContained=true -p:PublishTrimmed=true -o "$OutputPathArm64"

    - name: Upload build artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-linux
        path: |
          ${{ github.workspace }}/v2rayN/Release/linux*

    # release zip archive
    - name: Package release zip archive
      if: github.event.inputs.release_tag != ''
      run: |
        chmod 755 package-release-zip.sh
        ./package-release-zip.sh "$OutputArch" "$OutputPath64"
        ./package-release-zip.sh "$OutputArchArm" "$OutputPathArm64"
    
    - name: Upload zip archive to release
      uses: svenstaro/upload-release-action@v2
      if: github.event.inputs.release_tag != ''
      with:
        file: ${{ github.workspace }}/v2rayN*.zip
        tag: ${{ github.event.inputs.release_tag }}
        file_glob: true
        prerelease: true

  deb:
    needs: build
    if: |
      (github.event_name == 'workflow_dispatch' && github.event.inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04
    container:
      image: debian:13
    env:
      RELEASE_TAG: ${{ github.event.inputs.release_tag != '' && github.event.inputs.release_tag || github.ref_name }}

    steps:
    - name: Prepare tools (Debian)
      shell: bash
      run: |
        set -euo pipefail
        export DEBIAN_FRONTEND=noninteractive
        apt-get update
        apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file \
                           ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev \
                           libc6 libgcc-s1 libstdc++6 zlib1g libicu-dev libssl-dev

    - name: Checkout repo (for scripts)
      uses: actions/checkout@v6.0.2
      with:
        submodules: 'recursive'
        fetch-depth: '0'

    - name: Ensure script permissions
      run: chmod 755 package-debian.sh

    - name: Package DEB (Debian-family)
      run: ./package-debian.sh "${RELEASE_TAG}" --arch all

    - name: Collect DEBs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/deb"
        rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb/" || true
        find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_amd64.deb" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-64.deb" \; || true
        find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_arm64.deb" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-arm64.deb" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/deb" || true

    - name: Upload DEB artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-deb
        path: dist/deb/**/*.deb

    - name: Upload DEBs to release
      uses: svenstaro/upload-release-action@v2
      with:
        file: dist/deb/**/*.deb
        tag: ${{ env.RELEASE_TAG }}
        file_glob: true
        prerelease: true

  rpm:
    needs: build
    if: |
      (github.event_name == 'workflow_dispatch' && github.event.inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04
    container:
      image: registry.access.redhat.com/ubi10/ubi
    env:
      RELEASE_TAG: ${{ github.event.inputs.release_tag != '' && github.event.inputs.release_tag || github.ref_name }}

    steps:
    - name: Prepare tools (Red Hat)
      shell: bash
      run: |
        set -euo pipefail

        . /etc/os-release
        EL_MAJOR="${VERSION_ID%%.*}"
        echo "EL_MAJOR=${EL_MAJOR}"

        dnf -y makecache || true
        command -v curl >/dev/null || dnf -y install curl ca-certificates

        ARCH="$(uname -m)"
        case "$ARCH" in x86_64|aarch64) ;; *) echo "Unsupported arch: $ARCH"; exit 1 ;; esac

        install_epel_from_dir() {
          local base="$1" rpm
          echo "Try: $base"

          rpm="$(
            {
              curl -fsSL "$base/Packages/"   2>/dev/null
              curl -fsSL "$base/Packages/e/" 2>/dev/null | sed 's|href="|href="e/|'
            } |
            sed -n 's/.*href="\([^"]*epel-release-[^"]*\.noarch\.rpm\)".*/\1/p' |
            sort -V | tail -n1
          )" || true

          if [[ -n "$rpm" ]]; then
            dnf -y install "$base/Packages/$rpm"
            return 0
          fi
          return 1
        }

        FEDORA="https://dl.fedoraproject.org/pub/epel/epel-release-latest-${EL_MAJOR}.noarch.rpm"
        echo "Try Fedora: $FEDORA"

        if curl -fsSLI "$FEDORA" >/dev/null; then
          dnf -y install "$FEDORA"
        else
          ROCKY="https://dl.rockylinux.org/pub/rocky/${EL_MAJOR}/extras/${ARCH}/os"
          if install_epel_from_dir "$ROCKY"; then
            :
          else
            ALMA="https://repo.almalinux.org/almalinux/${EL_MAJOR}/extras/${ARCH}/os"
            if install_epel_from_dir "$ALMA"; then
              :
            else
              echo "EPEL bootstrap failed (Fedora/Rocky/Alma)"
              exit 1
            fi
          fi
        fi

        dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core \
                       rsync findutils tar gzip unzip which

        dnf repolist | grep -i epel || true

    - name: Checkout repo (for scripts)
      uses: actions/checkout@v6.0.2
      with:
        submodules: 'recursive'
        fetch-depth: '0'

    - name: Restore build artifacts
      uses: actions/download-artifact@v8
      with:
        name: v2rayN-linux
        path: ${{ github.workspace }}/v2rayN/Release

    - name: Ensure script permissions
      run: chmod 755 package-rhel.sh

    - name: Package RPM (RHEL-family)
      run: ./package-rhel.sh "${RELEASE_TAG}" --arch all

    - name: Collect RPMs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/rpm"
        rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm/" || true
        find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.x86_64.rpm"  -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-64.rpm" \;  || true
        find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.aarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/rpm" || true

    - name: Upload RPM artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-rpm
        path: dist/rpm/**/*.rpm

    - name: Upload RPMs to release
      uses: svenstaro/upload-release-action@v2
      with:
        file: dist/rpm/**/*.rpm
        tag: ${{ env.RELEASE_TAG }}
        file_glob: true
        prerelease: true
build-osx matrix .github/workflows/build-osx.yml
Triggers
workflow_dispatch, push
Runs on
macos-latest
Jobs
build
Matrix
configuration→ Release
Actions
svenstaro/upload-release-action, svenstaro/upload-release-action
Commands
  • cd v2rayN dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r osx-x64 -p:SelfContained=true -o $OutputPath64 dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r osx-arm64 -p:SelfContained=true -o $OutputPathArm64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r osx-x64 -p:SelfContained=true -p:PublishTrimmed=true -o $OutputPath64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r osx-arm64 -p:SelfContained=true -p:PublishTrimmed=true -o $OutputPathArm64
  • brew install create-dmg chmod 755 package-osx.sh ./package-osx.sh $OutputArch $OutputPath64 ${{ github.event.inputs.release_tag }} ./package-osx.sh $OutputArchArm $OutputPathArm64 ${{ github.event.inputs.release_tag }}
  • chmod 755 package-release-zip.sh ./package-release-zip.sh $OutputArch $OutputPath64 ./package-release-zip.sh $OutputArchArm $OutputPathArm64
View raw YAML
name: release macOS

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string
  push:
    branches:
      - master

env:
  OutputArch: "macos-64"
  OutputArchArm: "macos-arm64"
  OutputPath64:  "${{ github.workspace }}/v2rayN/Release/macos-64"
  OutputPathArm64:  "${{ github.workspace }}/v2rayN/Release/macos-arm64"

jobs:
  build:
    strategy:
      matrix:
        configuration: [Release]

    runs-on: macos-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v6.0.2
      with:
        submodules: 'recursive'
        fetch-depth: '0'

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

    - name: Build
      run: |
        cd v2rayN 
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r osx-x64   -p:SelfContained=true -o $OutputPath64
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r osx-arm64 -p:SelfContained=true -o $OutputPathArm64
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r osx-x64   -p:SelfContained=true -p:PublishTrimmed=true -o $OutputPath64
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r osx-arm64 -p:SelfContained=true -p:PublishTrimmed=true -o $OutputPathArm64

    - name: Upload build artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-macos
        path: |
          ${{ github.workspace }}/v2rayN/Release/macos*
    
    # release osx package
    - name: Package osx
      if: github.event.inputs.release_tag != ''
      run: |
        brew install create-dmg
        chmod 755 package-osx.sh
        ./package-osx.sh $OutputArch $OutputPath64 ${{ github.event.inputs.release_tag }}
        ./package-osx.sh $OutputArchArm $OutputPathArm64 ${{ github.event.inputs.release_tag }}
    
    - name: Upload dmg to release
      uses: svenstaro/upload-release-action@v2
      if: github.event.inputs.release_tag != ''
      with:
        file: ${{ github.workspace }}/v2rayN*.dmg
        tag: ${{ github.event.inputs.release_tag }}
        file_glob: true
        prerelease: true

    # release zip archive
    - name: Package release zip archive
      if: github.event.inputs.release_tag != ''
      run: |
        chmod 755 package-release-zip.sh
        ./package-release-zip.sh $OutputArch $OutputPath64
        ./package-release-zip.sh $OutputArchArm $OutputPathArm64
    
    - name: Upload zip archive to release
      uses: svenstaro/upload-release-action@v2
      if: github.event.inputs.release_tag != ''
      with:
        file: ${{ github.workspace }}/v2rayN*.zip
        tag: ${{ github.event.inputs.release_tag }}
        file_glob: true
        prerelease: true
build-windows matrix .github/workflows/build-windows.yml
Triggers
workflow_dispatch, push
Runs on
ubuntu-latest
Jobs
build
Matrix
configuration→ Release
Actions
svenstaro/upload-release-action
Commands
  • cd v2rayN dotnet publish ./v2rayN/v2rayN.csproj -c Release -r win-x64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPath64 dotnet publish ./v2rayN/v2rayN.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPathArm64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-x64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPath64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPathArm64
  • chmod 755 package-release-zip.sh ./package-release-zip.sh $OutputArch $OutputPath64 ./package-release-zip.sh $OutputArchArm $OutputPathArm64
View raw YAML
name: release Windows

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string
  push:
    branches:
      - master

env:
  OutputArch: "windows-64"
  OutputArchArm: "windows-arm64"
  OutputPath64:  "${{ github.workspace }}/v2rayN/Release/windows-64"
  OutputPathArm64:  "${{ github.workspace }}/v2rayN/Release/windows-arm64"

jobs:
  build:
    strategy:
      matrix:
        configuration: [Release]

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v6.0.2

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

    - name: Build
      run: |
        cd v2rayN 
        dotnet publish ./v2rayN/v2rayN.csproj     -c Release -r win-x64   -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPath64
        dotnet publish ./v2rayN/v2rayN.csproj     -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPathArm64
        dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-x64   -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPath64
        dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPathArm64
  
    - name: Upload build artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-windows
        path: |
          ${{ github.workspace }}/v2rayN/Release/windows*
    
    # release zip archive
    - name: Package release zip archive
      if: github.event.inputs.release_tag != ''
      run: |
        chmod 755 package-release-zip.sh
        ./package-release-zip.sh $OutputArch $OutputPath64
        ./package-release-zip.sh $OutputArchArm $OutputPathArm64
    
    - name: Upload zip archive to release
      uses: svenstaro/upload-release-action@v2
      if: github.event.inputs.release_tag != ''
      with:
        file: ${{ github.workspace }}/v2rayN*.zip
        tag: ${{ github.event.inputs.release_tag }}
        file_glob: true
        prerelease: true
build-windows-desktop matrix .github/workflows/build-windows-desktop.yml
Triggers
workflow_dispatch, push
Runs on
ubuntu-latest
Jobs
build
Matrix
configuration→ Release
Actions
svenstaro/upload-release-action
Commands
  • cd v2rayN dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r win-x64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPath64 dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPathArm64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-x64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPath64 dotnet publish ./AmazTool/AmazTool.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPathArm64
  • chmod 755 package-release-zip.sh ./package-release-zip.sh $OutputArch $OutputPath64 mv "v2rayN-${OutputArch}.zip" "v2rayN-${OutputArch}-desktop.zip" ./package-release-zip.sh $OutputArchArm $OutputPathArm64 mv "v2rayN-${OutputArchArm}.zip" "v2rayN-${OutputArchArm}-desktop.zip"
View raw YAML
name: release Windows desktop (Avalonia UI)

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string
  push:
    branches:
      - master

env:
  OutputArch: "windows-64"
  OutputArchArm: "windows-arm64"
  OutputPath64:  "${{ github.workspace }}/v2rayN/Release/windows-64"
  OutputPathArm64:  "${{ github.workspace }}/v2rayN/Release/windows-arm64"

jobs:
  build:
    strategy:
      matrix:
        configuration: [Release]

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v6.0.2
      with:
        submodules: 'recursive'
        fetch-depth: '0'

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

    - name: Build
      run: |
        cd v2rayN 
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r win-x64   -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPath64
        dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -o $OutputPathArm64
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r win-x64   -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPath64
        dotnet publish ./AmazTool/AmazTool.csproj             -c Release -r win-arm64 -p:SelfContained=true -p:EnableWindowsTargeting=true -p:PublishTrimmed=true -o $OutputPathArm64

    - name: Upload build artifacts
      uses: actions/upload-artifact@v7.0.0
      with:
        name: v2rayN-windows-desktop
        path: |
          ${{ github.workspace }}/v2rayN/Release/windows*

    # release zip archive
    - name: Package release zip archive
      if: github.event.inputs.release_tag != ''
      run: |
        chmod 755 package-release-zip.sh
        ./package-release-zip.sh $OutputArch $OutputPath64
        mv "v2rayN-${OutputArch}.zip" "v2rayN-${OutputArch}-desktop.zip"
        ./package-release-zip.sh $OutputArchArm $OutputPathArm64
        mv "v2rayN-${OutputArchArm}.zip" "v2rayN-${OutputArchArm}-desktop.zip"

    - name: Upload zip archive to release
      uses: svenstaro/upload-release-action@v2
      if: github.event.inputs.release_tag != ''
      with:
        file: ${{ github.workspace }}/v2rayN*.zip
        tag: ${{ github.event.inputs.release_tag }}
        file_glob: true
        prerelease: true
winget-publish .github/workflows/winget-publish.yml
Triggers
workflow_dispatch, release
Runs on
windows-latest
Jobs
winget
Commands
  • $wingetPackage = "2dust.v2rayN" $gitToken = "${{ secrets.PT_WINGET }}" $github = Invoke-RestMethod -uri "https://api.github.com/repos/2dust/v2rayN/releases" $targetRelease = $github | Where-Object -Property prerelease -match 'False' | Select -First 1 $x64InstallerUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'v2rayN-windows-64\.zip' | Select -ExpandProperty browser_download_url $arm64InstallerUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'v2rayN-windows-arm64\.zip' | Select -ExpandProperty browser_download_url $ver = $targetRelease.tag_name # getting latest wingetcreate file iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe Write-Host "Updating with both x64 and arm64 installers" Write-Host "Version: $ver" Write-Host "x64 URL: $x64InstallerUrl" Write-Host "arm64 URL: $arm64InstallerUrl" .\wingetcreate.exe update $wingetPackage -s -v $ver -u "$x64InstallerUrl|x64" "$arm64InstallerUrl|arm64" -t $gitToken
View raw YAML
name: WinGet submission on release
# based off of https://github.com/nushell/nushell/blob/main/.github/workflows/winget-submission.yml
# inspired by https://github.com/microsoft/PowerToys/blob/main/.github/workflows/package-submissions.yml
# Modified by @MerrickZ https://github.com/anpho

on:
  workflow_dispatch:
  release:
    types: [released]

jobs:
  winget:
    name: Publish winget package
    runs-on: windows-latest
    steps:
      - name: Submit v2ray package to Windows Package Manager Community Repository
        run: |

          $wingetPackage = "2dust.v2rayN"
          $gitToken = "${{ secrets.PT_WINGET }}"

          $github = Invoke-RestMethod -uri "https://api.github.com/repos/2dust/v2rayN/releases" 

          $targetRelease = $github | Where-Object -Property prerelease -match 'False' | Select -First 1
          
          $x64InstallerUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'v2rayN-windows-64\.zip' | Select -ExpandProperty browser_download_url
          $arm64InstallerUrl = $targetRelease | Select -ExpandProperty assets -First 1 | Where-Object -Property name -match 'v2rayN-windows-arm64\.zip' | Select -ExpandProperty browser_download_url
          
          $ver = $targetRelease.tag_name

          # getting latest wingetcreate file
          iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
          
          Write-Host "Updating with both x64 and arm64 installers"
          Write-Host "Version: $ver"
          Write-Host "x64 URL: $x64InstallerUrl"
          Write-Host "arm64 URL: $arm64InstallerUrl"
          
          .\wingetcreate.exe update $wingetPackage -s -v $ver -u "$x64InstallerUrl|x64" "$arm64InstallerUrl|arm64" -t $gitToken