diff --git a/.github/workflows/release-win7.yml b/.github/workflows/release-win7.yml new file mode 100644 index 000000000000..63637dec8b9b --- /dev/null +++ b/.github/workflows/release-win7.yml @@ -0,0 +1,195 @@ +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: Set up Go compiler + uses: actions/setup-go@v5 + with: + go-version: 'stable' + check-latest: true + + - name: Download patched Go + uses: actions/checkout@v4 + with: + # To change the repository of toolchail, change it here + repository: 'MetaCubeX/go' + ref: 'release-branch.go1.23' + + - name: Build patched Go + run: | + cd ./src + . ./all.bash + cd ${{ github.workspace }} + mkdir -p patched-go + rsync -a --exclude 'patched-go' ./ 'patched-go' + + - name: Save patched builder + uses: actions/cache/save@v4 + with: + path: patched-go + key: xray-patched-go-${{ github.sha }}-${{ github.run_number }} + + - 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: Checkout codebase + uses: actions/checkout@v4 + + - name: Restore Go builder + uses: actions/cache/restore@v4 + with: + path: patched-go + key: xray-patched-go-${{ github.sha }}-${{ github.run_number }} + + - name: Download dependencies and build Xray + run: | + echo "Setup environment..." + export PATH=$PATH:${{ github.workspace }}/patched-go/bin + ${{ github.workspace }}/patched-go/bin/go version + ${{ github.workspace }}/patched-go/bin/go env -w GOPATH=${{ github.workspace }} + ${{ github.workspace }}/patched-go/bin/go env -w GOROOT=${{ github.workspace }}/patched-go + echo "Download dependencies..." + ${{ github.workspace }}/patched-go/bin/go mod download + echo "Build Xray..." + mkdir -p build_assets + ${{ github.workspace }}/patched-go/bin/go clean -v -i $PWD + rm -f xray xray.exe wxray.exe xray_softfloat + ${{ github.workspace }}/patched-go/bin/go build -o xray.exe -trimpath -ldflags "-X github.com/xtls/xray-core/core.build=win7-${{ github.ref_name }}-${{ github.sha }} -s -w -buildid=" -v ./main + ${{ github.workspace }}/patched-go/bin/go build -o wxray.exe -trimpath -ldflags "-H windowsgui -X github.com/xtls/xray-core/core.build=win7-${{ github.ref_name }}-${{ github.sha }} -s -w -buildid=" -v ./main + echo "Build completed." + 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