fix: 修復 Tailscale SSH 需互動式登入問題,新增 --ssh 參數與 Smoke Test

This commit is contained in:
Your Name 2026-01-21 17:40:58 +08:00
parent 41a7111db2
commit 45376702f2

View file

@ -42,14 +42,19 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
# ======================================== # ========================================
# Step 2: 啟動 Tailscale # Step 2: 啟動 Tailscale非互動模式
# 說明:使用 Tailscale Auth Key 加入 tailnet # 說明:使用 Tailscale Auth Key 加入 tailnet啟用 SSH
# 重要:必須使用 --ssh 參數才能使用 tailscale ssh
# ======================================== # ========================================
- name: 🔗 啟動 Tailscale 連線 - name: 🔗 啟動 Tailscale 連線(非互動模式)
uses: tailscale/github-action@v2 uses: tailscale/github-action@v2
with: with:
authkey: ${{ secrets.TAILSCALE_AUTHKEY }} authkey: ${{ secrets.TAILSCALE_AUTHKEY }}
args: "--ssh --accept-dns=false --accept-routes=false"
# 使用 ephemeral keyrunner 結束後自動離開 tailnet # 使用 ephemeral keyrunner 結束後自動離開 tailnet
# --ssh: 啟用 Tailscale SSH 功能
# --accept-dns=false: 不使用 Tailscale DNS
# --accept-routes=false: 不接受其他節點的路由
# ======================================== # ========================================
# Step 3: 驗證 Tailscale 連線 # Step 3: 驗證 Tailscale 連線
@ -69,7 +74,18 @@ jobs:
# 顯示本機 Tailscale IP # 顯示本機 Tailscale IP
echo "" echo ""
echo "🌐 本機 Tailscale IP" echo "🌐 本機 Tailscale IP"
tailscale ip -4 TAILSCALE_IP=$(tailscale ip -4)
echo "${TAILSCALE_IP}"
# 確認 SSH 功能已啟用
echo ""
echo "🔐 檢查 SSH 功能狀態:"
if tailscale status --json | grep -q '"SSH":true'; then
echo "✅ Tailscale SSH 功能已啟用"
else
echo "⚠️ 正在檢查 SSH 狀態..."
tailscale status --json | head -50
fi
# 等待 Tailscale 完全連線 # 等待 Tailscale 完全連線
echo "" echo ""
@ -92,27 +108,113 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 4: 測試 Tailscale SSH 連線 # Step 4: 測試 Tailscale SSH 連線(非互動式)
# 說明:使用 tailscale ssh 測試連線(不使用傳統 ssh # 說明:使用 tailscale ssh 測試連線,確保不需要人工登入
# ======================================== # ========================================
- name: 🔐 測試 Tailscale SSH 連線 - name: 🔐 測試 Tailscale SSH 連線(非互動式)
run: | run: |
echo "========================================" echo "========================================"
echo "🔐 測試 Tailscale SSH 連線" echo "🔐 測試 Tailscale SSH 連線(非互動式)"
echo "========================================" echo "========================================"
echo "使用者: ${{ secrets.SSH_USER }}" echo "使用者: ${{ secrets.SSH_USER }}"
echo "主機: ${{ secrets.SSH_HOST }}" echo "主機: ${{ secrets.SSH_HOST }}"
echo "" echo ""
# 使用 tailscale ssh 連線測試 # 設定超時時間,避免卡住
tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \ echo "⏳ 嘗試 SSH 連線(超時 30 秒)..."
"echo '✅ Tailscale SSH 連線成功!' && echo '主機名稱:' && hostname && echo '當前使用者:' && whoami"
# 使用 timeout 命令確保不會卡住
if timeout 30 tailscale ssh -o "StrictHostKeyChecking=no" -o "BatchMode=yes" \
${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
"echo '✅ Tailscale SSH 連線成功!' && echo '主機名稱:' && hostname && echo '當前使用者:' && whoami" 2>&1; then
echo ""
echo "✅ SSH 非互動式測試成功!"
else
# 檢查是否出現需要登入的訊息
echo ""
echo "❌ SSH 連線失敗,嘗試診斷..."
echo ""
# 嘗試不帶選項的連線
RESULT=$(timeout 10 tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "hostname" 2>&1 || true)
echo "診斷輸出: ${RESULT}"
if echo "${RESULT}" | grep -qi "authenticate\|login.tailscale.com\|additional check"; then
echo ""
echo "========================================"
echo "❌ 錯誤Tailscale SSH 需要互動式登入!"
echo "========================================"
echo ""
echo "🔧 可能的原因:"
echo " 1. TAILSCALE_AUTHKEY 沒有啟用 SSH 權限"
echo " 2. 遠端主機的 Tailscale SSH policy 需要調整"
echo " 3. Auth Key 需要重新產生(勾選 'Pre-authorized'"
echo ""
echo "📋 建議修復步驟:"
echo " 1. 前往 https://login.tailscale.com/admin/settings/keys"
echo " 2. 產生新的 Auth Key確保勾選"
echo " - Reusable"
echo " - Ephemeral"
echo " - Pre-authorized重要"
echo " 3. 更新 GitHub Secret: TAILSCALE_AUTHKEY"
echo ""
exit 1
fi
echo "⚠️ 連線可能有其他問題,但不是登入問題"
fi
echo "" echo ""
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 5: 準備遠端工作目錄 # Step 5: Smoke Test環境驗證
# 說明:快速驗證遠端環境是否正常
# ========================================
- name: 🧪 Smoke Test環境驗證
run: |
echo "========================================"
echo "🧪 Smoke Test - 驗證遠端環境"
echo "========================================"
tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
set -e
echo "📋 測試項目 1進入目標目錄"
echo "----------------------------------------"
WORKDIR="/home/bioailab/miniconda3/lid/app/docker_build"
mkdir -p "${WORKDIR}"
cd "${WORKDIR}"
echo "✅ 目前目錄: $(pwd)"
echo ""
echo "📋 測試項目 2Git 版本"
echo "----------------------------------------"
git --version
echo "✅ Git 可用"
echo ""
echo "📋 測試項目 3Docker 版本"
echo "----------------------------------------"
docker version --format '{{.Server.Version}}' || docker --version
echo "✅ Docker 可用"
echo ""
echo "📋 測試項目 4Docker Buildx 版本"
echo "----------------------------------------"
docker buildx version
echo "✅ Docker Buildx 可用"
echo ""
echo "========================================"
echo "✅ 所有 Smoke Test 通過!"
echo "========================================"
REMOTE_EOF
echo "========================================"
# ========================================
# Step 6: 準備遠端工作目錄
# 說明:確保遠端工作目錄存在 # 說明:確保遠端工作目錄存在
# ======================================== # ========================================
- name: 📁 準備遠端工作目錄 - name: 📁 準備遠端工作目錄
@ -129,7 +231,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 6: Clone 或更新專案程式碼 # Step 7: Clone 或更新專案程式碼
# 說明:在遠端主機上 clone 或 pull 最新程式碼 # 說明:在遠端主機上 clone 或 pull 最新程式碼
# ======================================== # ========================================
- name: 📥 Clone 或更新專案程式碼 - name: 📥 Clone 或更新專案程式碼
@ -173,7 +275,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 7: Docker Login # Step 8: Docker Login
# 說明:在遠端主機登入 Docker Hub # 說明:在遠端主機登入 Docker Hub
# ======================================== # ========================================
- name: 🔐 Docker Hub 登入 - name: 🔐 Docker Hub 登入
@ -188,7 +290,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 8: 設定 Docker BuildxMulti-Arch 必要) # Step 9: 設定 Docker BuildxMulti-Arch 必要)
# 說明:建立支援多架構的 buildx builder # 說明:建立支援多架構的 buildx builder
# ======================================== # ========================================
- name: 🔧 設定 Docker Buildx - name: 🔧 設定 Docker Buildx
@ -223,7 +325,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 9: Multi-Arch Docker Build & Push # Step 10: Multi-Arch Docker Build & Push
# 說明:使用 buildx 同時建構 amd64 和 arm64 並推送 # 說明:使用 buildx 同時建構 amd64 和 arm64 並推送
# ======================================== # ========================================
- name: 🔨 Multi-Arch Docker Build & Push - name: 🔨 Multi-Arch Docker Build & Push
@ -278,7 +380,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 10: 驗證 Docker Hub 映像 # Step 11: 驗證 Docker Hub 映像
# 說明:確認映像已成功推送並檢查架構 # 說明:確認映像已成功推送並檢查架構
# ======================================== # ========================================
- name: ✅ 驗證 Docker Hub 映像 - name: ✅ 驗證 Docker Hub 映像
@ -306,7 +408,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 11: 清理本次 Build 資源 # Step 12: 清理本次 Build 資源
# 說明:只清理本次 build 產生的 builder 和 cache # 說明:只清理本次 build 產生的 builder 和 cache
# ======================================== # ========================================
- name: 🧹 清理本次 Build 資源 - name: 🧹 清理本次 Build 資源
@ -350,7 +452,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 12: Docker Logout # Step 13: Docker Logout
# 說明:登出 Docker Hub # 說明:登出 Docker Hub
# ======================================== # ========================================
- name: 🔒 Docker Hub 登出 - name: 🔒 Docker Hub 登出
@ -366,7 +468,7 @@ jobs:
echo "========================================" echo "========================================"
# ======================================== # ========================================
# Step 13: 顯示完成摘要 # Step 14: 顯示完成摘要
# 說明:顯示本次 build 的摘要資訊 # 說明:顯示本次 build 的摘要資訊
# ======================================== # ========================================
- name: 📋 Build 完成摘要 - name: 📋 Build 完成摘要