From c8b17ad18d71b1cc38751e4f00131ddba07b9c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=90=B2=93=F0=90=B3=9B=F0=90=B3=AA=F0=90=B3=82?= =?UTF-8?q?=F0=90=B3=90=20=F0=90=B2=80=F0=90=B3=A2=F0=90=B3=A6=F0=90=B3=AB?= =?UTF-8?q?=F0=90=B3=A2=20=F0=90=B2=A5=F0=90=B3=94=F0=90=B3=9B=F0=90=B3=AA?= =?UTF-8?q?=F0=90=B3=8C=F0=90=B3=91=F0=90=B3=96=F0=90=B3=87?= <26771058+KobeArthurScofield@users.noreply.github.com> Date: Wed, 1 Jan 2025 16:06:35 +0800 Subject: [PATCH] Build: Use patched newer Go version to build Windows 7 assets (#4192) https://github.com/XTLS/go-win7 --- .github/workflows/release-win7.yml | 166 +++++++++++++++++++++++++++++ .github/workflows/release.yml | 14 +-- .github/workflows/test.yml | 2 +- common/reflect/marshal.go | 47 ++++---- core/config.go | 14 ++- go.mod | 2 +- 6 files changed, 197 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/release-win7.yml diff --git a/.github/workflows/release-win7.yml b/.github/workflows/release-win7.yml new file mode 100644 index 00000000..18745397 --- /dev/null +++ b/.github/workflows/release-win7.yml @@ -0,0 +1,166 @@ +name: Build and Release for Windows 7 + +on: + workflow_dispatch: + release: + types: [published] + push: + branches: + - main + paths: + # - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/release-win7.yml" + pull_request: + types: [opened, synchronize, reopened] + paths: + # - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/release-win7.yml" + +jobs: + prepare: + runs-on: ubuntu-latest + steps: + - name: Restore Cache + uses: actions/cache/restore@v4 + with: + path: resources + key: xray-geodat- + + - name: Update Geodat + id: update + uses: nick-fields/retry@v3 + with: + timeout_minutes: 60 + retry_wait_seconds: 60 + max_attempts: 60 + command: | + [ -d 'resources' ] || mkdir resources + LIST=('geoip geoip geoip' 'domain-list-community dlc geosite') + for i in "${LIST[@]}" + do + INFO=($(echo $i | awk 'BEGIN{FS=" ";OFS=" "} {print $1,$2,$3}')) + FILE_NAME="${INFO[2]}.dat" + echo -e "Verifying HASH key..." + HASH="$(curl -sL "https://raw.githubusercontent.com/v2fly/${INFO[0]}/release/${INFO[1]}.dat.sha256sum" | awk -F ' ' '{print $1}')" + if [ -s "./resources/${FILE_NAME}" ] && [ "$(sha256sum "./resources/${FILE_NAME}" | awk -F ' ' '{print $1}')" == "${HASH}" ]; then + continue + else + echo -e "Downloading https://raw.githubusercontent.com/v2fly/${INFO[0]}/release/${INFO[1]}.dat..." + curl -L "https://raw.githubusercontent.com/v2fly/${INFO[0]}/release/${INFO[1]}.dat" -o ./resources/${FILE_NAME} + echo -e "Verifying HASH key..." + [ "$(sha256sum "./resources/${FILE_NAME}" | awk -F ' ' '{print $1}')" == "${HASH}" ] || { echo -e "The HASH key of ${FILE_NAME} does not match cloud one."; exit 1; } + echo "unhit=true" >> $GITHUB_OUTPUT + fi + done + + - name: Save Cache + uses: actions/cache/save@v4 + if: ${{ steps.update.outputs.unhit }} + with: + path: resources + key: xray-geodat-${{ github.sha }}-${{ github.run_number }} + + build: + needs: prepare + permissions: + contents: write + strategy: + matrix: + include: + # BEGIN Windows 7 + - goos: windows + goarch: amd64 + assetname: win7-64 + - goos: windows + goarch: 386 + assetname: win7-32 + # END Windows 7 + fail-fast: false + + runs-on: ubuntu-latest + env: + GOOS: ${{ matrix.goos}} + GOARCH: ${{ matrix.goarch }} + CGO_ENABLED: 0 + steps: + - name: Show workflow information + run: | + _NAME=${{ matrix.assetname }} + echo "GOOS: ${{ matrix.goos }}, GOARCH: ${{ matrix.goarch }}, RELEASE_NAME: $_NAME" + echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: stable + check-latest: true + + - name: Setup patched builder + run: | + GOSDK=$(go env GOROOT) + curl -O -L https://github.com/XTLS/go-win7/releases/latest/download/go-for-win7-linux-amd64.zip + rm -r $GOSDK/* + unzip ./go-for-win7-linux-amd64.zip -d $GOSDK + + - name: Checkout codebase + uses: actions/checkout@v4 + + - name: Get project dependencies + run: go mod download + + - name: Build Xray + run: | + mkdir -p build_assets + make + find . -maxdepth 1 -type f -regex './\(wxray\|xray\).exe' -exec mv {} ./build_assets/ \; + + - name: Restore Cache + uses: actions/cache/restore@v4 + with: + path: resources + key: xray-geodat- + + - name: Copy README.md & LICENSE + run: | + mv -f resources/* build_assets + cp ${GITHUB_WORKSPACE}/README.md ./build_assets/README.md + cp ${GITHUB_WORKSPACE}/LICENSE ./build_assets/LICENSE + + - name: Create ZIP archive + if: github.event_name == 'release' + shell: bash + run: | + pushd build_assets || exit 1 + touch -mt $(date +%Y01010000) * + zip -9vr ../Xray-${{ env.ASSET_NAME }}.zip . + popd || exit 1 + FILE=./Xray-${{ env.ASSET_NAME }}.zip + DGST=$FILE.dgst + for METHOD in {"md5","sha1","sha256","sha512"} + do + openssl dgst -$METHOD $FILE | sed 's/([^)]*)//g' >>$DGST + done + + - name: Change the name + run: | + mv build_assets Xray-${{ env.ASSET_NAME }} + + - name: Upload files to Artifacts + uses: actions/upload-artifact@v4 + with: + name: Xray-${{ env.ASSET_NAME }} + path: | + ./Xray-${{ env.ASSET_NAME }}/* + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + if: github.event_name == 'release' + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ./Xray-${{ env.ASSET_NAME }}.zip* + tag: ${{ github.ref }} + file_glob: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 77e668b4..3b706680 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,9 +78,7 @@ jobs: # Include amd64 on all platforms. goos: [windows, freebsd, openbsd, linux, darwin] goarch: [amd64, 386] - gotoolchain: [""] patch-assetname: [""] - exclude: # Exclude i386 on darwin - goarch: 386 @@ -155,16 +153,6 @@ jobs: goarch: arm goarm: 7 # END OPENBSD ARM - # BEGIN Windows 7 - - goos: windows - goarch: amd64 - gotoolchain: 1.21.4 - patch-assetname: win7-64 - - goos: windows - goarch: 386 - gotoolchain: 1.21.4 - patch-assetname: win7-32 - # END Windows 7 fail-fast: false runs-on: ubuntu-latest @@ -187,7 +175,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: ${{ matrix.gotoolchain || '1.23' }} + go-version-file: go.mod check-latest: true - name: Get project dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1e531d52..da178740 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.23' + go-version-file: go.mod check-latest: true - name: Restore Cache uses: actions/cache/restore@v4 diff --git a/common/reflect/marshal.go b/common/reflect/marshal.go index 42f47385..2b224b45 100644 --- a/common/reflect/marshal.go +++ b/common/reflect/marshal.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "reflect" + "slices" "strings" cnet "github.com/xtls/xray-core/common/net" @@ -31,9 +32,6 @@ func JSONMarshalWithoutEscape(t interface{}) ([]byte, error) { } func marshalTypedMessage(v *cserial.TypedMessage, ignoreNullValue bool, insertTypeInfo bool) interface{} { - if v == nil { - return nil - } tmsg, err := v.GetInstance() if err != nil { return nil @@ -194,29 +192,28 @@ func marshalKnownType(v interface{}, ignoreNullValue bool, insertTypeInfo bool) } } +var valueKinds = []reflect.Kind{ + reflect.Bool, + reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64, + reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64, + reflect.Uintptr, + reflect.Float32, + reflect.Float64, + reflect.Complex64, + reflect.Complex128, + reflect.String, +} + func isValueKind(kind reflect.Kind) bool { - switch kind { - case reflect.Bool, - reflect.Int, - reflect.Int8, - reflect.Int16, - reflect.Int32, - reflect.Int64, - reflect.Uint, - reflect.Uint8, - reflect.Uint16, - reflect.Uint32, - reflect.Uint64, - reflect.Uintptr, - reflect.Float32, - reflect.Float64, - reflect.Complex64, - reflect.Complex128, - reflect.String: - return true - default: - return false - } + return slices.Contains(valueKinds, kind) } func marshalInterface(v interface{}, ignoreNullValue bool, insertTypeInfo bool) interface{} { diff --git a/core/config.go b/core/config.go index 4390766d..ec9e5aa4 100644 --- a/core/config.go +++ b/core/config.go @@ -2,6 +2,7 @@ package core import ( "io" + "slices" "strings" "github.com/xtls/xray-core/common" @@ -64,14 +65,11 @@ func GetMergedConfig(args cmdarg.Arg) (string, error) { supported := []string{"json", "yaml", "toml"} for _, file := range args { format := getFormat(file) - for _, s := range supported { - if s == format { - files = append(files, &ConfigSource{ - Name: file, - Format: format, - }) - break - } + if slices.Contains(supported, format) { + files = append(files, &ConfigSource{ + Name: file, + Format: format, + }) } } return ConfigMergedFormFiles(files) diff --git a/go.mod b/go.mod index 37358157..3edb3d5b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/xtls/xray-core -go 1.21.4 +go 1.23 require ( github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0