name: release Linux on: workflow_dispatch: inputs: release_tag: required: false type: string push: branches: - master permissions: contents: write jobs: build: uses: ./.github/workflows/build.yml with: target: linux release-zip: if: inputs.release_tag != '' needs: build uses: ./.github/workflows/package-zip.yml with: target: linux release_tag: ${{ inputs.release_tag }} deb: name: build and release deb x64 & arm64 if: | (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) runs-on: ubuntu-24.04 container: debian:13 env: RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }} steps: - name: Prepare tools (Debian) shell: bash run: | set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file \ ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev \ libc6 libgcc-s1 libstdc++6 zlib1g libicu-dev libssl-dev - name: Checkout repo (for scripts) uses: actions/checkout@v6.0.2 with: submodules: 'recursive' fetch-depth: '0' - name: Ensure script permissions run: chmod 755 package-debian.sh - name: Package DEB (Debian-family) run: ./package-debian.sh "${RELEASE_TAG}" --arch all - name: Collect DEBs into workspace run: | mkdir -p "$GITHUB_WORKSPACE/dist/deb" rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb/" || true find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_amd64.deb" \ -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-64.deb" \; || true find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_arm64.deb" \ -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-arm64.deb" \; || true echo "==== Dist tree ====" ls -R "$GITHUB_WORKSPACE/dist/deb" || true - name: Upload DEBs to release uses: svenstaro/upload-release-action@v2 with: file: dist/deb/**/*.deb tag: ${{ env.RELEASE_TAG }} file_glob: true prerelease: true rpm: name: build and release rpm x64 & arm64 if: | (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) runs-on: ubuntu-24.04 container: registry.access.redhat.com/ubi10/ubi env: RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }} steps: - name: Prepare tools (Red Hat) shell: bash run: | set -euo pipefail . /etc/os-release EL_MAJOR="${VERSION_ID%%.*}" echo "EL_MAJOR=${EL_MAJOR}" dnf -y makecache || true command -v curl >/dev/null || dnf -y install curl ca-certificates ARCH="$(uname -m)" case "$ARCH" in x86_64|aarch64) ;; *) echo "Unsupported arch: $ARCH"; exit 1 ;; esac install_epel_from_dir() { local base="$1" rpm echo "Try: $base" rpm="$( { curl -fsSL "$base/Packages/" 2>/dev/null curl -fsSL "$base/Packages/e/" 2>/dev/null | sed 's|href="|href="e/|' } | sed -n 's/.*href="\([^"]*epel-release-[^"]*\.noarch\.rpm\)".*/\1/p' | sort -V | tail -n1 )" || true if [[ -n "$rpm" ]]; then dnf -y install "$base/Packages/$rpm" return 0 fi return 1 } FEDORA="https://dl.fedoraproject.org/pub/epel/epel-release-latest-${EL_MAJOR}.noarch.rpm" echo "Try Fedora: $FEDORA" if curl -fsSLI "$FEDORA" >/dev/null; then dnf -y install "$FEDORA" else ROCKY="https://dl.rockylinux.org/pub/rocky/${EL_MAJOR}/extras/${ARCH}/os" if install_epel_from_dir "$ROCKY"; then : else ALMA="https://repo.almalinux.org/almalinux/${EL_MAJOR}/extras/${ARCH}/os" if install_epel_from_dir "$ALMA"; then : else echo "EPEL bootstrap failed (Fedora/Rocky/Alma)" exit 1 fi fi fi dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core \ rsync findutils tar gzip unzip which dnf repolist | grep -i epel || true - name: Checkout repo (for scripts) uses: actions/checkout@v6.0.2 with: submodules: 'recursive' fetch-depth: '0' - name: Ensure script permissions run: chmod 755 package-rhel.sh - name: Package RPM (RHEL-family) run: ./package-rhel.sh "${RELEASE_TAG}" --arch all - name: Collect RPMs into workspace run: | mkdir -p "$GITHUB_WORKSPACE/dist/rpm" rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm/" || true find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.x86_64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-64.rpm" \; || true find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.aarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true echo "==== Dist tree ====" ls -R "$GITHUB_WORKSPACE/dist/rpm" || true - name: Upload RPMs to release uses: svenstaro/upload-release-action@v2 with: file: dist/rpm/**/*.rpm tag: ${{ env.RELEASE_TAG }} file_glob: true prerelease: true rpm-riscv64: name: build and release rpm riscv64 if: | (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) runs-on: ubuntu-24.04-riscv container: rockylinux/rockylinux:10-ubi env: RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }} steps: - name: Prepare tools (Red Hat) shell: bash run: | set -euo pipefail dnf -y makecache dnf -y install \ sudo git rpm-build rpmdevtools dnf-plugins-core rsync findutils tar gzip unzip which curl jq wget file \ ca-certificates desktop-file-utils xdg-utils python3 gcc make glibc-devel kernel-headers libatomic libstdc++ - name: Checkout repo (for scripts) shell: bash env: GITHUB_TOKEN: ${{ github.token }} run: | set -euo pipefail rm -rf ./* git init . git config --global --add safe.directory "$PWD" git remote add origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" git fetch --depth=1 origin "${GITHUB_SHA}" git checkout FETCH_HEAD git submodule update --init --recursive - name: Ensure script permissions run: chmod 755 package-rhel-riscv.sh - name: Package RPM (RHEL-family) run: ./package-rhel-riscv.sh "${RELEASE_TAG}" - name: Collect RPMs into workspace run: | mkdir -p "$GITHUB_WORKSPACE/dist/rpm-riscv64" rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm-riscv64/" || true find "$GITHUB_WORKSPACE/dist/rpm-riscv64" -name "*.riscv64.rpm" \ -exec mv {} "$GITHUB_WORKSPACE/dist/rpm-riscv64/v2rayN-linux-rhel-riscv64.rpm" \; || true echo "==== Dist tree ====" ls -R "$GITHUB_WORKSPACE/dist/rpm-riscv64" || true - name: Upload RPMs to release shell: bash env: GITHUB_TOKEN: ${{ github.token }} run: | set -euo pipefail shopt -s globstar nullglob files=(dist/rpm-riscv64/**/*.rpm) (( ${#files[@]} )) || { echo "No RPMs found."; exit 1; } api="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${RELEASE_TAG}" upload_url="$(curl -fsSL -H "Authorization: Bearer ${GITHUB_TOKEN}" "$api" | jq -r '.upload_url // empty' | sed 's/{?name,label}//')" [[ "$upload_url" ]] || { echo "Release upload URL not found: ${RELEASE_TAG}"; exit 1; } for f in "${files[@]}"; do echo "Uploading ${f##*/}" curl -fsSL -X POST \ -H "Authorization: Bearer ${GITHUB_TOKEN}" \ -H "Content-Type: application/x-rpm" \ --data-binary @"$f" \ "${upload_url}?name=${f##*/}" done