Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build: Build Windows 7 binaries with a patched newer Go #4195

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
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
195 changes: 195 additions & 0 deletions .github/workflows/release-win7.yml
Original file line number Diff line number Diff line change
@@ -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 ../
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:$PWD/patched-go/bin
./patched-go/bin/go version
./patched-go/bin/go env -w GOPATH=$PWD
./patched-go/bin/go env -w GOROOT=$PWD/patched-go
echo "Download dependencies..."
./patched-go/bin/go mod download
echo "Build Xray..."
mkdir -p build_assets
./patched-go/bin/go clean -v -i $PWD
rm -f xray xray.exe wxray.exe xray_softfloat
./patched-go/bin/go build -o xray.exe -trimpath -ldflags "-s -w -buildid=" -v ./main
./patched-go/bin/go build -o wxray.exe -trimpath -ldflags "-H windowsgui -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
Loading