diff --git a/.github/build/friendly-filenames.json b/.github/build/friendly-filenames.json new file mode 100644 index 00000000..ea82a036 --- /dev/null +++ b/.github/build/friendly-filenames.json @@ -0,0 +1,33 @@ +{ + "android-arm64": { "friendlyName": "android-arm64-v8a"}, + "darwin-amd64": { "friendlyName": "macos-64" }, + "darwin-arm64": { "friendlyName": "macos-arm64-v8a" }, + "dragonfly-amd64": { "friendlyName": "dragonfly-64" }, + "freebsd-386": { "friendlyName": "freebsd-32" }, + "freebsd-amd64": { "friendlyName": "freebsd-64" }, + "freebsd-arm64": { "friendlyName": "freebsd-arm64-v8a" }, + "freebsd-arm7": { "friendlyName": "freebsd-arm32-v7a" }, + "linux-386": { "friendlyName": "linux-32" }, + "linux-amd64": { "friendlyName": "linux-64" }, + "linux-arm5": { "friendlyName": "linux-arm32-v5" }, + "linux-arm64": { "friendlyName": "linux-arm64-v8a" }, + "linux-arm6": { "friendlyName": "linux-arm32-v6" }, + "linux-arm7": { "friendlyName": "linux-arm32-v7a" }, + "linux-mips64le": { "friendlyName": "linux-mips64le" }, + "linux-mips64": { "friendlyName": "linux-mips64" }, + "linux-mipsle": { "friendlyName": "linux-mips32le" }, + "linux-mipslesoftfloat": { "friendlyName": "linux-mips32le-softfloat" }, + "linux-mips": { "friendlyName": "linux-mips32" }, + "linux-mipssoftfloat": { "friendlyName": "linux-mips32-softfloat" }, + "linux-riscv64": { "friendlyName": "linux-riscv64" }, + "linux-ppc64": { "friendlyName": "linux-ppc64" }, + "linux-ppc64le": { "friendlyName": "linux-rppc64le" }, + "linux-s390x": { "friendlyName": "linux-s390x" }, + "openbsd-386": { "friendlyName": "openbsd-32" }, + "openbsd-amd64": { "friendlyName": "openbsd-64" }, + "openbsd-arm64": { "friendlyName": "openbsd-arm64-v8a" }, + "openbsd-arm7": { "friendlyName": "openbsd-arm32-v7a" }, + "windows-amd64": { "friendlyName": "windows-64" }, + "windows-386": { "friendlyName": "windows-32" }, + "windows-arm7": { "friendlyName": "windows-arm32-v7a" } +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..317c8a1c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,212 @@ +name: Build and Release + +on: + workflow_dispatch: + release: + types: [published] + push: + branches: + - main + paths: + - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/*.yml" + pull_request: + types: [opened, synchronize, reopened] + paths: + - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/*.yml" +jobs: + build: + strategy: + matrix: + # Include amd64 on all platforms. + goos: [windows, freebsd, openbsd, linux, dragonfly, darwin] + goarch: [amd64, 386] + exclude: + # Exclude i386 on darwin and dragonfly. + - goarch: 386 + goos: dragonfly + - goarch: 386 + goos: darwin + include: + # BEIGIN MacOS ARM64 + - goos: darwin + goarch: arm64 + # END MacOS ARM64 + # BEGIN Linux ARM 5 6 7 + - goos: linux + goarch: arm + goarm: 7 + - goos: linux + goarch: arm + goarm: 6 + - goos: linux + goarch: arm + goarm: 5 + # END Linux ARM 5 6 7 + # BEGIN Android ARM 8 + - goos: android + goarch: arm64 + # END Android ARM 8 + # Windows ARM 7 + - goos: windows + goarch: arm + goarm: 7 + # BEGIN Other architectures + # BEGIN riscv64 & ARM64 + - goos: linux + goarch: arm64 + - goos: linux + goarch: riscv64 + # END riscv64 & ARM64 + # BEGIN MIPS + - goos: linux + goarch: mips64 + - goos: linux + goarch: mips64le + - goos: linux + goarch: mipsle + - goos: linux + goarch: mips + # END MIPS + # BEGIN PPC + - goos: linux + goarch: ppc64 + - goos: linux + goarch: ppc64le + # END PPC + # BEGIN FreeBSD ARM + - goos: freebsd + goarch: arm64 + - goos: freebsd + goarch: arm + goarm: 7 + # END FreeBSD ARM + # BEGIN S390X + - goos: linux + goarch: s390x + # END S390X + # END Other architectures + # BEGIN OPENBSD ARM + - goos: openbsd + goarch: arm64 + - goos: openbsd + goarch: arm + goarm: 7 + # END OPENBSD ARM + fail-fast: false + #配置编译环境 + runs-on: ubuntu-20.04 + env: + GOOS: ${{ matrix.goos }} + GOARCH: ${{ matrix.goarch }} + GOARM: ${{ matrix.goarm }} + CGO_ENABLED: 0 + steps: + - name: Checkout codebase + uses: actions/checkout@v2 + + - name: Show workflow information + id: get_filename + run: | + export _NAME=$(jq ".[\"$GOOS-$GOARCH$GOARM$GOMIPS\"].friendlyName" -r < .github/build/friendly-filenames.json) + echo "GOOS: $GOOS, GOARCH: $GOARCH, GOARM: $GOARM, GOMIPS: $GOMIPS, RELEASE_NAME: $_NAME" + echo "::set-output name=ASSET_NAME::$_NAME" + echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ^1.16 + + - name: Get project dependencies + run: go mod download + + - name: Replace Custom to Commit ID + if: github.event_name != 'release' + run: | + ID=$(git rev-parse --short ${{ github.sha }}) + if [ "${{ github.event_name }}" == 'pull_request' ] + then + ID=$(git rev-parse --short ${{ github.event.pull_request.head.sha }}) + fi + sed -i '/build/ s/Custom/'$ID'/' ./core/core.go + + - name: Build Xray + run: | + mkdir -p build_assets + go build -v -o build_assets/xray -trimpath -ldflags "-s -w -buildid=" ./main + + - name: Build Mips softfloat Xray + if: matrix.goarch == 'mips' || matrix.goarch == 'mipsle' + run: | + GOMIPS=softfloat go build -v -o build_assets/xray_softfloat -trimpath -ldflags "-s -w -buildid=" ./main + + - name: Rename Windows Xray + if: matrix.goos == 'windows' + run: | + cd ./build_assets || exit 1 + mv xray xray.exe + + - name: Prepare to release + run: | + cp ${GITHUB_WORKSPACE}/README.md ./build_assets/README.md + cp ${GITHUB_WORKSPACE}/LICENSE ./build_assets/LICENSE + 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}')) + LASTEST_TAG="$(curl -sL "https://api.github.com/repos/v2fly/${INFO[0]}/releases" | jq -r ".[0].tag_name" || echo "latest")" + FILE_NAME="${INFO[2]}.dat" + echo -e "Downloading ${FILE_NAME}..." + curl -L "https://github.com/v2fly/${INFO[0]}/releases/download/${LASTEST_TAG}/${INFO[1]}.dat" -o ./build_assets/${FILE_NAME} + echo -e "Verifying HASH key..." + HASH="$(curl -sL "https://github.com/v2fly/${INFO[0]}/releases/download/${LASTEST_TAG}/${INFO[1]}.dat.sha256sum" | awk -F ' ' '{print $1}')" + [ "$(sha256sum "./build_assets/${FILE_NAME}" | awk -F ' ' '{print $1}')" == "${HASH}" ] || { echo -e "The HASH key of ${FILE_NAME} does not match cloud one."; exit 1; } + done + + - name: Create ZIP archive + shell: bash + run: | + pushd build_assets || exit 1 + touch -mt 202101010000 * + zip -9vr ../Xray-$ASSET_NAME.zip . + for CORE in $(ls xray*) + do + COREDGST=$CORE.dgst + for METHOD in {"md5","sha1","sha256","sha512"} + do + openssl dgst -$METHOD $CORE | sed 's/([^)]*)//g' >>$COREDGST + done + done + popd || exit 1 + FILE=./Xray-$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-$ASSET_NAME + + - name: Upload files to Artifacts + uses: actions/upload-artifact@v2 + with: + name: Xray-${{ steps.get_filename.outputs.ASSET_NAME }} + path: | + ./Xray-${{ steps.get_filename.outputs.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-${{ steps.get_filename.outputs.ASSET_NAME }}.zip* + tag: ${{ github.ref }} + file_glob: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..bd09690e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,48 @@ +name: Test + +on: + push: + branches: + - main + paths: + - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/*.yml" + pull_request: + types: [opened, synchronize, reopened] + paths: + - "**/*.go" + - "go.mod" + - "go.sum" + - ".github/workflows/*.yml" + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ^1.16 + - name: Checkout codebase + uses: actions/checkout@v2 + + - name: Prepare geo*dat + if: ${{ matrix.os != 'windows-latest' }} + run: | + mkdir resources + wget -O ./resources/geoip.dat https://github.com/v2fly/geoip/releases/latest/download/geoip.dat + wget -O ./resources/geosite.dat https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat + - name: Prepare geo*dat for Windows + if: ${{ matrix.os == 'windows-latest' }} + run: | + mkdir resources + Invoke-WebRequest -Uri "https://github.com/v2fly/geoip/releases/latest/download/geoip.dat" -OutFile "./resources/geoip.dat" + Invoke-WebRequest -Uri "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat" -OutFile "./resources/geosite.dat" + - name: Test + run: go test -timeout 1h -v ./... diff --git a/app/dns/server_test.go b/app/dns/server_test.go index 2e517609..03ae1bfc 100644 --- a/app/dns/server_test.go +++ b/app/dns/server_test.go @@ -101,8 +101,8 @@ func (*staticHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { rr, _ := dns.NewRR("localhost-b. IN A 127.0.0.4") ans.Answer = append(ans.Answer, rr) - case q.Name == "Mijia\\ Cloud." && q.Qtype == dns.TypeA: - rr, _ := dns.NewRR("Mijia\\ Cloud. IN A 127.0.0.1") + case q.Name == "mijia\\ cloud." && q.Qtype == dns.TypeA: + rr, _ := dns.NewRR("mijia\\ cloud. IN A 127.0.0.1") ans.Answer = append(ans.Answer, rr) } } diff --git a/testing/scenarios/tls_test.go b/testing/scenarios/tls_test.go index c81e5122..cb420821 100644 --- a/testing/scenarios/tls_test.go +++ b/testing/scenarios/tls_test.go @@ -583,7 +583,7 @@ func TestHTTP2(t *testing.T) { var errg errgroup.Group for i := 0; i < 10; i++ { - errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) + errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Error(err)