shanshanzhong 69c037bf51
Some checks failed
site-dist-deploy / build-and-deploy (push) Failing after 30m37s
ci(docker): 优化节点安装流程并添加 musl 支持
添加 DEBIAN_FRONTEND=noninteractive 以避免 apt 安装交互问题
预装编译依赖确保 nvm 安装成功
添加 musl libc 检测以支持不同环境的节点安装
优化节点目录查找逻辑
2026-01-04 01:15:43 -08:00

155 lines
5.3 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: site-dist-deploy
on:
push:
branches:
- main
- develop
pull_request:
branches:
- main
- develop
env:
VITE_APP_BASE_URL: https://h.hifast.biz
SSH_HOST: ${{ vars.PRO_SSH_HOST }}
SSH_PORT: ${{ vars.PRO_SSH_PORT }}
SSH_USER: ${{ vars.PRO_SSH_USER }}
SSH_PASSWORD: ${{ vars.PRO_SSH_PASSWORD }}
DEPLOY_PATH: /var/www/down
jobs:
build-and-deploy:
runs-on: landing-hero-web01
steps:
- name: Manual checkout (no Node required)
run: |
set -e
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
git fetch --all --tags
git checkout "${{ github.ref_name }}"
git reset --hard "origin/${{ github.ref_name }}"
else
REPO_URL="${{ github.server_url }}/${{ github.repository }}"
echo "Cloning $REPO_URL"
git clone --depth=1 --branch "${{ github.ref_name }}" "$REPO_URL" .
git fetch --tags
fi
- name: Build dist in Node container
run: |
set -e
install_pkgs() {
PKGS="$*"
if command -v apt-get >/dev/null 2>&1; then
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y $PKGS
elif command -v yum >/dev/null 2>&1; then
yum install -y $PKGS
elif command -v dnf >/dev/null 2>&1; then
dnf install -y $PKGS
elif command -v apk >/dev/null 2>&1; then
apk add --no-cache $PKGS
elif command -v zypper >/dev/null 2>&1; then
zypper install -y $PKGS
else
echo "No known package manager found to install: $PKGS"; exit 1
fi
}
if ! command -v curl >/dev/null 2>&1; then install_pkgs curl ca-certificates; fi
if ! command -v tar >/dev/null 2>&1; then install_pkgs tar; fi
if ! command -v xz >/dev/null 2>&1 && ! command -v unxz >/dev/null 2>&1; then install_pkgs xz-utils || install_pkgs xz; fi
# 预装编译依赖,避免 nvm 源码安装失败
install_pkgs python3 make gcc g++ || true
if ! command -v node >/dev/null 2>&1; then
NODE_VER="v20.19.6"
ARCH="$(uname -m)"
case "$ARCH" in
x86_64) NODE_ARCH="linux-x64" ;;
aarch64) NODE_ARCH="linux-arm64" ;;
arm64) NODE_ARCH="linux-arm64" ;;
*) echo "Unsupported arch: $ARCH"; exit 1 ;;
esac
# 检测 libc 类型musl 用 musl 包
LIBC_TYPE="glibc"
if command -v ldd >/dev/null 2>&1; then
if ldd --version 2>&1 | grep -qi musl; then LIBC_TYPE="musl"; fi
fi
if [ "$LIBC_TYPE" = "musl" ] && [ "$NODE_ARCH" = "linux-x64" ]; then
NODE_TARBALL="node-${NODE_VER}-linux-x64-musl.tar.xz"
else
NODE_TARBALL="node-${NODE_VER}-${NODE_ARCH}.tar.xz"
fi
URL="https://nodejs.org/dist/${NODE_VER}/${NODE_TARBALL}"
curl -fsSL "$URL" -o "/tmp/${NODE_TARBALL}"
mkdir -p "$HOME/node"
tar -xJf "/tmp/${NODE_TARBALL}" -C "$HOME/node"
# 解析实际解压目录名
NODE_DIR="$(find "$HOME/node" -maxdepth 1 -type d -name "node-${NODE_VER}-*" | head -n1)"
export PATH="$NODE_DIR/bin:$PATH"
fi
if ! node -v >/dev/null 2>&1; then
export NVM_DIR="$HOME/.nvm"
if [ ! -d "$NVM_DIR" ]; then
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
fi
. "$NVM_DIR/nvm.sh"
nvm install 20
nvm use 20
fi
node -v
npm -v
npm ci
echo "VITE_APP_BASE_URL=${VITE_APP_BASE_URL}" > .env.pord
npm run build:prod
tar -C dist -czf site_dist.tgz .
- name: Prepare target directory
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
timeout: 300s
script: |
mkdir -p ${{ env.DEPLOY_PATH }}
rm -rf ${{ env.DEPLOY_PATH }}/*
mkdir -p /tmp/ci-upload
- name: Upload dist archive
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
source: "site_dist.tgz"
target: "/tmp/ci-upload"
overwrite: true
- name: Extract archive to deploy path
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
timeout: 300s
script: |
cd ${{ env.DEPLOY_PATH }}
tar -xzf /tmp/ci-upload/site_dist.tgz
rm -f /tmp/ci-upload/site_dist.tgz
- name: Reload Nginx
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
timeout: 300s
script: |
nginx -t && nginx -s reload