name: Release on: release: types: [prereleased] push: branches: - master - v* - dev* 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: # 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 Windows ARM 7 - goos: windows goarch: arm goarm: 7 # END Windows ARM 7 # BEGIN FreeBSD ARM 6 7 - goos: freebsd goarch: arm goarm: 6 - goos: freebsd goarch: arm goarm: 7 # END FreeBSD ARM 6 7 # BEGIN OpenBSD ARM 6 7 - goos: openbsd goarch: arm goarm: 6 - goos: openbsd goarch: arm goarm: 7 # END OpenBSD ARM 6 7 # BEGIN Other architectures - goos: darwin goarch: arm64 - goos: linux goarch: arm64 - goos: linux goarch: riscv64 - goos: windows goarch: arm64 - goos: android goarch: arm64 - goos: freebsd goarch: arm64 - goos: openbsd goarch: arm64 # BEGIN MIPS - goos: linux goarch: mips64 - goos: linux goarch: mips64le - goos: linux goarch: mipsle - goos: linux goarch: mips # END MIPS # END Other architectures fail-fast: false runs-on: ubuntu-latest env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GOARM: ${{ matrix.goarm }} CGO_ENABLED: 0 steps: - name: Checkout codebase uses: actions/checkout@v3 with: fetch-depth: 0 - name: Show workflow information id: get_filename run: | export _NAME=$(jq ".[\"$GOOS-$GOARCH$GOARM\"].friendlyName" -r < release/friendly-filenames.json) echo "GOOS: $GOOS, GOARCH: $GOARCH, GOARM: $GOARM, RELEASE_NAME: $_NAME" echo "ASSET_NAME=$_NAME" >> $GITHUB_OUTPUT echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV - name: Set up Go uses: actions/setup-go@v4 with: go-version: ^1.20 - name: Get project dependencies run: go mod download - name: Build V2Ray run: | mkdir -p build_assets go build -v -o build_assets/v2ray -trimpath -ldflags "-s -w -buildid=" ./main - name: Rename Windows V2Ray if: matrix.goos == 'windows' run: | cd ./build_assets || exit 1 mv v2ray v2ray.exe - name: Download geo files run: | wget -O release/config/geoip.dat "https://raw.githubusercontent.com/v2fly/geoip/release/geoip.dat" wget -O release/config/geoip-only-cn-private.dat "https://raw.githubusercontent.com/v2fly/geoip/release/geoip-only-cn-private.dat" wget -O release/config/geosite.dat "https://raw.githubusercontent.com/v2fly/domain-list-community/release/dlc.dat" - name: Prepare package run: cp -v ./release/config/*.* ./build_assets - name: Prepare package for Linux if: matrix.goos == 'linux' run: cp -rv ./release/config/systemd ./build_assets/ - name: Create ZIP archive run: | pushd build_assets || exit 1 zip -9vr ../v2ray-$ASSET_NAME.zip . popd || exit 1 FILE=./v2ray-$ASSET_NAME.zip DGST=$FILE.dgst openssl dgst -md5 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha1 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha256 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha512 $FILE | sed 's/([^)]*)//g' >>$DGST - name: Upload ZIP file to Artifacts uses: actions/upload-artifact@v3 with: name: v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip path: v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip - name: Upload files to GitHub release uses: svenstaro/upload-release-action@v2 if: github.event_name == 'release' with: repo_token: ${{ secrets.GITHUB_TOKEN }} file_glob: true file: ./v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip* tag: ${{ github.ref }} signature: runs-on: ubuntu-latest needs: build steps: - name: Checkout codebase uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v4 with: go-version: ^1.20 - uses: actions/download-artifact@v3 with: path: build_artifacts - name: Create extra package run: | pushd ./release/extra/ zip -9vr ../../build_artifacts/v2ray-extra.zip . popd - name: Generate shasum run: | go get -v github.com/v2fly/V2BuildAssist/v2buildutil cd build_artifacts || exit 1 mkdir .temp mv ./*/*.zip ./.temp rmdir ./*/ mv ./.temp/* . ls -lah --recursive { go run github.com/v2fly/V2BuildAssist/v2buildutil gen version $(git describe --tags $(git rev-list --tags --max-count=1)) go run github.com/v2fly/V2BuildAssist/v2buildutil gen project "v2fly" for zip in $(ls *.zip); do go run github.com/v2fly/V2BuildAssist/v2buildutil gen file ${zip} done } >Release.unsigned.unsorted go run github.com/v2fly/V2BuildAssist/v2buildutil gen sort < Release.unsigned.unsorted > Release.unsigned rm -f Release.unsigned.unsorted FILE=./Release.unsigned DGST=$FILE.dgst openssl dgst -md5 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha1 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha256 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha512 $FILE | sed 's/([^)]*)//g' >>$DGST - uses: actions/upload-artifact@v3 with: name: Release.unsigned path: build_artifacts/Release.unsigned - uses: actions/upload-artifact@v3 with: name: Release.unsigned.dgst path: build_artifacts/Release.unsigned.dgst - uses: actions/upload-artifact@v3 with: name: v2ray-extra.zip path: build_artifacts/v2ray-extra.zip - name: Upload Release.unsigned related files uses: svenstaro/upload-release-action@v2 if: github.event_name == 'release' with: repo_token: ${{ secrets.GITHUB_TOKEN }} file_glob: true file: build_artifacts/Release.unsigned* tag: ${{ github.ref }} - name: Upload extra package uses: svenstaro/upload-release-action@v2 if: github.event_name == 'release' with: repo_token: ${{ secrets.GITHUB_TOKEN }} file_glob: true file: build_artifacts/v2ray-extra.zip tag: ${{ github.ref }} buildContainer: if: github.event_name == 'release' needs: signature strategy: fail-fast: false matrix: variant: [std, extra] arch: - v2Name: 32 containerName: 386 - v2Name: 64 containerName: amd64 - v2Name: arm32-v6 containerName: arm/v6 - v2Name: arm32-v7a containerName: arm/v7 - v2Name: arm64-v8a containerName: arm64 - v2Name: arm64-v8a containerName: arm64/v8 name: Build And Push image runs-on: ubuntu-latest env: REGISTRY_USER: ${{ github.actor }} REGISTRY_PASSWORD: ${{ github.token }} IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }} RELEASE_REPO: ${{ github.repository }} steps: - uses: actions/checkout@v3 - name: Log in to ghcr.io uses: redhat-actions/podman-login@v1 with: username: ${{ env.REGISTRY_USER }} password: ${{ env.REGISTRY_PASSWORD }} registry: ${{ env.IMAGE_REGISTRY }} - name: Download Assets run: | bash ./release/container/downloadAssets.sh ${{ github.ref_name }} ${{ matrix.arch.v2Name }} ${{ matrix.arch.containerName }} ${{ matrix.variant }} - name: Buildah Action id: build-image uses: redhat-actions/buildah-build@v2 with: image: v2ray tags: ${{ github.ref_name }}-${{ matrix.arch.v2Name }}-${{ matrix.variant }} containerfiles: | ./release/container/Containerfile build-args: | TARGETPLATFORM=${{ matrix.arch.containerName }} VARIANT=${{ matrix.variant }} archs: ${{ matrix.arch.containerName }} context: context/linux/${{ matrix.arch.containerName }}/${{ matrix.variant }} extra-args: | --squash --timestamp 0 - name: Push To ghcr.io uses: redhat-actions/push-to-registry@v2 with: image: ${{ steps.build-image.outputs.image }} tags: ${{ steps.build-image.outputs.tags }} registry: ${{ env.IMAGE_REGISTRY }}