mirror of
https://ghproxy.net/https://github.com/appleboy/scp-action.git
synced 2025-05-23 08:17:46 +00:00
docs: add comprehensive Chinese documentation and localization support
- Add links to Traditional and Simplified Chinese documentation in the README - Add a complete README in Simplified Chinese, including setup, configuration, usage examples, best practices, troubleshooting, and FAQ - Add a complete README in Traditional Chinese, including setup, configuration, usage examples, best practices, troubleshooting, and FAQ Signed-off-by: appleboy <appleboy.tw@gmail.com>
This commit is contained in:
parent
bf323b8729
commit
17026f90b8
@ -1,5 +1,7 @@
|
||||
# 🚀 SCP for GitHub Actions
|
||||
|
||||
[繁體中文](README.zh-tw.md) | [简体中文](README.zh-cn.md)
|
||||
|
||||
[GitHub Action](https://github.com/features/actions) for copying files and artifacts via SSH.
|
||||
|
||||
[](https://github.com/appleboy/scp-action/actions)
|
||||
|
347
README.zh-cn.md
Normal file
347
README.zh-cn.md
Normal file
@ -0,0 +1,347 @@
|
||||
# 🚀 GitHub Actions 的 SCP
|
||||
|
||||
[English](README.md) | [繁體中文](README.zh-tw.md)
|
||||
|
||||
[GitHub Action](https://github.com/features/actions) 用于通过 SSH 复制文件和构建产物。
|
||||
|
||||
[](https://github.com/appleboy/scp-action/actions)
|
||||
|
||||
> **注意:** 仅支持 **Linux** [docker](https://www.docker.com/) 容器。
|
||||
|
||||
---
|
||||
|
||||
## ✨ 功能特性
|
||||
|
||||
- ✅ 通过 SSH 将文件和产物复制到一台或多台远程服务器
|
||||
- ✅ 支持 SSH 密钥和密码认证
|
||||
- ✅ 完全支持 SSH 代理(跳板机)
|
||||
- ✅ 处理 Linux ↔ Windows 路径转换
|
||||
- ✅ 集成 GitHub Artifacts 工作流
|
||||
- ✅ 支持增量与差异文件传输
|
||||
- ✅ 丰富的高级配置选项
|
||||
|
||||
---
|
||||
|
||||
## 📦 目录
|
||||
|
||||
- [🚀 GitHub Actions 的 SCP](#-github-actions-的-scp)
|
||||
- [✨ 功能特性](#-功能特性)
|
||||
- [📦 目录](#-目录)
|
||||
- [🚀 快速开始](#-快速开始)
|
||||
- [⚙️ 配置说明](#️-配置说明)
|
||||
- [🔌 连接设置](#-连接设置)
|
||||
- [📁 文件传输设置](#-文件传输设置)
|
||||
- [🌐 代理设置](#-代理设置)
|
||||
- [🛡️ 最佳实践与安全性](#️-最佳实践与安全性)
|
||||
- [🖥️ 跨平台注意事项](#️-跨平台注意事项)
|
||||
- [💡 使用示例](#-使用示例)
|
||||
- [🧩 场景导览](#-场景导览)
|
||||
- [示例 1:基本 SSH 密码](#示例-1基本-ssh-密码)
|
||||
- [示例 2:多台服务器](#示例-2多台服务器)
|
||||
- [示例 3:仅传输变更文件](#示例-3仅传输变更文件)
|
||||
- [示例 4:集成 Artifacts](#示例-4集成-artifacts)
|
||||
- [示例 5:Windows 服务器](#示例-5windows-服务器)
|
||||
- [🗝️ SSH 密钥设置](#️-ssh-密钥设置)
|
||||
- [🧰 常见错误代码](#-常见错误代码)
|
||||
- [🔄 工作流程图](#-工作流程图)
|
||||
- [FAQ 与故障排查](#faq-与故障排查)
|
||||
- [📝 许可证](#-许可证)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
在 GitHub Actions 工作流中通过 SSH 复制文件和产物:
|
||||
|
||||
```yaml
|
||||
name: scp files
|
||||
on: [push]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 通过 SSH 复制文件
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
password: ${{ secrets.PASSWORD }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 🔌 连接设置
|
||||
|
||||
| 变量 | 说明 | 默认值 | 必填 |
|
||||
| --------------- | -------------------------------- | ------ | ---- |
|
||||
| host | 远程主机(多台用逗号分隔) | - | ✓ |
|
||||
| port | SSH 端口 | 22 | |
|
||||
| username | SSH 用户名 | - | ✓ |
|
||||
| password | SSH 密码(建议优先使用密钥认证) | - | |
|
||||
| key | SSH 私钥内容 | - | |
|
||||
| key_path | SSH 私钥文件路径 | - | |
|
||||
| passphrase | SSH 私钥密码 | - | |
|
||||
| fingerprint | 主机密钥 SHA256 指纹验证 | - | |
|
||||
| protocol | IP 协议:'tcp'、'tcp4' 或 'tcp6' | tcp | |
|
||||
| timeout | SSH 连接超时 | 30s | |
|
||||
| command_timeout | SCP 命令超时 | 10m | |
|
||||
|
||||
### 📁 文件传输设置
|
||||
|
||||
| 变量 | 说明 | 默认值 | 安全性说明 |
|
||||
| ---------------- | --------------------------------- | ------ | -------------- |
|
||||
| source | 本地要传输的文件/目录(逗号分隔) | - | 请使用明确路径 |
|
||||
| target | 远程目标目录(必须为目录) | - | 避免使用根目录 |
|
||||
| rm | 上传前移除目标目录 | - | 谨慎使用 |
|
||||
| strip_components | 传输时移除前置路径元素 | - | |
|
||||
| overwrite | 使用 tar 覆盖现有文件 | - | |
|
||||
| tar_dereference | tar 传输时跟随符号链接 | - | |
|
||||
| tar_tmp_path | 目标端 tar 临时文件路径 | - | |
|
||||
| tar_exec | 目标端 tar 执行文件路径 | tar | |
|
||||
| debug | 启用调试输出 | - | |
|
||||
| curl_insecure | curl 使用 --insecure | false | 不推荐 |
|
||||
| capture_stdout | 将命令 stdout 作为 action 输出 | false | |
|
||||
| version | 指定 drone-scp 版本 | - | |
|
||||
|
||||
### 🌐 代理设置
|
||||
|
||||
| 变量 | 说明 | 默认值 | 必填 |
|
||||
| ------------------------- | -------------------------- | ------ | ---- |
|
||||
| proxy_host | SSH 代理主机 | - | |
|
||||
| proxy_port | SSH 代理端口 | 22 | |
|
||||
| proxy_username | SSH 代理用户名 | - | |
|
||||
| proxy_password | SSH 代理密码 | - | |
|
||||
| proxy_key | SSH 代理私钥内容 | - | |
|
||||
| proxy_key_path | SSH 代理私钥文件路径 | - | |
|
||||
| proxy_passphrase | SSH 代理私钥密码 | - | |
|
||||
| proxy_fingerprint | 代理主机 SHA256 指纹验证 | - | |
|
||||
| proxy_use_insecure_cipher | 启用较不安全的代理加密算法 | - | |
|
||||
| proxy_timeout | SSH 代理连接超时 | 30s | |
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ 最佳实践与安全性
|
||||
|
||||
- **建议优先使用 SSH 密钥认证**,提升安全性。
|
||||
- 将所有敏感信息(host、username、password、key)存放于 **GitHub Secrets**。
|
||||
- 定期**更换部署密钥**(建议每 90 天一次)。
|
||||
- 限制目标服务器目录的写入权限。
|
||||
- 启用主机密钥指纹验证以防止中间人攻击。
|
||||
- 避免使用 root 用户登录 SSH。
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ 跨平台注意事项
|
||||
|
||||
| 场景 | Linux 服务器 | Windows 服务器 |
|
||||
| -------- | -------------- | ----------------------- |
|
||||
| 路径格式 | `/path/to/dir` | `/c/path/to/dir` |
|
||||
| 必要设置 | 无 | `tar_dereference: true` |
|
||||
| 权限 | 保留 | 可能需手动设置 ACL |
|
||||
| Shell | bash(默认) | Git Bash(OpenSSH) |
|
||||
|
||||
> 🚩 **重要提醒:**
|
||||
> 复制到 Windows 服务器时:
|
||||
>
|
||||
> - 安装 Git for Windows 并将 OpenSSH 默认 shell 设为 Git Bash
|
||||
> - 使用类 Unix 目标路径(如 `/c/Users/...`)
|
||||
> - 启用 `tar_dereference` 处理符号链接
|
||||
|
||||
---
|
||||
|
||||
## 💡 使用示例
|
||||
|
||||
### 🧩 场景导览
|
||||
|
||||
- **基本文件传输** → [示例 1](#示例-1基本-ssh-密码)
|
||||
- **多台服务器部署** → [示例 2](#示例-2多台服务器)
|
||||
- **仅传输变更文件** → [示例 3](#示例-3仅传输变更文件)
|
||||
- **集成 Artifacts** → [示例 4](#示例-4集成-artifacts)
|
||||
- **Windows 服务器设置** → [示例 5](#示例-5windows-服务器)
|
||||
|
||||
---
|
||||
|
||||
#### 示例 1:基本 SSH 密码
|
||||
|
||||
```yaml
|
||||
- name: 通过 SSH 密码复制文件
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: example.com
|
||||
username: foo
|
||||
password: bar
|
||||
port: 22
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 示例 2:多台服务器
|
||||
|
||||
```yaml
|
||||
- name: 复制到多台服务器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: "foo.com,bar.com"
|
||||
username: foo
|
||||
password: bar
|
||||
port: 22
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 示例 3:仅传输变更文件
|
||||
|
||||
```yaml
|
||||
- name: 获取变更文件
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v35
|
||||
with:
|
||||
since_last_remote_commit: true
|
||||
separator: ","
|
||||
|
||||
- name: 复制变更文件到服务器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.KEY }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: ${{ steps.changed-files.outputs.all_changed_files }}
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 示例 4:集成 Artifacts
|
||||
|
||||
```yaml
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: my-artifact
|
||||
path: world.txt
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: my-artifact
|
||||
path: distfiles
|
||||
|
||||
- name: 复制 artifact 到服务器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.KEY }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: distfiles/*
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 示例 5:Windows 服务器
|
||||
|
||||
```yaml
|
||||
- name: 复制到 Windows
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
port: 22
|
||||
source: "your_source_path"
|
||||
target: "/c/path/to/target/"
|
||||
tar_dereference: true
|
||||
rm: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗝️ SSH 密钥设置
|
||||
|
||||
1. **生成 SSH 密钥**(在本地执行):
|
||||
|
||||
```bash
|
||||
# RSA
|
||||
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||||
# ED25519
|
||||
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
|
||||
```
|
||||
|
||||
2. **将公钥添加到服务器**:
|
||||
|
||||
```bash
|
||||
cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys'
|
||||
# 或 ed25519
|
||||
cat .ssh/id_ed25519.pub | ssh user@host 'cat >> .ssh/authorized_keys'
|
||||
```
|
||||
|
||||
3. **将私钥内容复制到 GitHub Secrets**:
|
||||
|
||||
```bash
|
||||
clip < ~/.ssh/id_rsa
|
||||
# 或
|
||||
clip < ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
> 更多细节请参考 [SSH 免密登录](http://www.linuxproblem.org/art_9.html)。
|
||||
|
||||
**OpenSSH 注意事项:**
|
||||
如遇到 `ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]`,请确认密钥算法已被支持。
|
||||
Ubuntu 20.04+ 可在 `/etc/ssh/sshd_config` 或 `/etc/ssh/sshd_config.d/` 添加:
|
||||
|
||||
```sh
|
||||
CASignatureAlgorithms +ssh-rsa
|
||||
```
|
||||
|
||||
或使用 ed25519 密钥(默认支持)。
|
||||
|
||||
---
|
||||
|
||||
## 🧰 常见错误代码
|
||||
|
||||
| 错误代码 | 可能原因 | 解决方法 |
|
||||
| -------------- | ------------------- | --------------------------------- |
|
||||
| `ECONNREFUSED` | 端口错误/防火墙阻挡 | 检查端口和防火墙设置 |
|
||||
| `ENOENT` | 找不到源文件 | 使用绝对路径或检查 checkout 步骤 |
|
||||
| `EAUTH` | 认证失败 | 检查密钥格式和权限(需 PEM 格式) |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 工作流程图
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant G as GitHub Runner
|
||||
participant S as Target Server
|
||||
G->>S: 建立 SSH 连接
|
||||
S-->>G: 验证凭证
|
||||
G->>S: (可选)移除目标目录
|
||||
G->>G: 打包源文件
|
||||
G->>S: 传输打包文件
|
||||
S->>S: 解压和处理文件
|
||||
S-->>G: 返回结果
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ 与故障排查
|
||||
|
||||
- **Q: 为什么认证失败?**
|
||||
A: 请检查 SSH 密钥格式、权限,以及密钥是否已添加到服务器。
|
||||
|
||||
- **Q: 如何只复制变更文件?**
|
||||
A: 使用 `tj-actions/changed-files` 获取变更文件并传递给 `source`。
|
||||
|
||||
- **Q: 如何部署到多台服务器?**
|
||||
A: `host` 参数用逗号分隔多台主机,例如:`host: "foo.com,bar.com"`
|
||||
|
||||
- **Q: 如何复制到 Windows?**
|
||||
A: 设置 Git Bash,使用类 Unix 路径,并启用 `tar_dereference`。
|
||||
|
||||
---
|
||||
|
||||
## 📝 许可证
|
||||
|
||||
MIT License
|
347
README.zh-tw.md
Normal file
347
README.zh-tw.md
Normal file
@ -0,0 +1,347 @@
|
||||
# 🚀 GitHub Actions 的 SCP
|
||||
|
||||
[English](README.md) | [简体中文](README.zh-cn.md)
|
||||
|
||||
[GitHub Action](https://github.com/features/actions) 用於透過 SSH 複製檔案與產物。
|
||||
|
||||
[](https://github.com/appleboy/scp-action/actions)
|
||||
|
||||
> **注意:** 只支援 **Linux** [docker](https://www.docker.com/) 容器。
|
||||
|
||||
---
|
||||
|
||||
## ✨ 功能特色
|
||||
|
||||
- ✅ 透過 SSH 將檔案與產物複製到一台或多台遠端伺服器
|
||||
- ✅ 支援 SSH 金鑰與密碼驗證
|
||||
- ✅ 完整支援 SSH Proxy(跳板機)
|
||||
- ✅ 處理 Linux ↔ Windows 路徑轉換
|
||||
- ✅ 整合 GitHub Artifacts 工作流程
|
||||
- ✅ 支援增量與差異檔案傳輸
|
||||
- ✅ 豐富的進階設定選項
|
||||
|
||||
---
|
||||
|
||||
## 📦 目錄
|
||||
|
||||
- [🚀 GitHub Actions 的 SCP](#-github-actions-的-scp)
|
||||
- [✨ 功能特色](#-功能特色)
|
||||
- [📦 目錄](#-目錄)
|
||||
- [🚀 快速開始](#-快速開始)
|
||||
- [⚙️ 設定說明](#️-設定說明)
|
||||
- [🔌 連線設定](#-連線設定)
|
||||
- [📁 檔案傳輸設定](#-檔案傳輸設定)
|
||||
- [🌐 Proxy 設定](#-proxy-設定)
|
||||
- [🛡️ 最佳實踐與安全性](#️-最佳實踐與安全性)
|
||||
- [🖥️ 跨平台注意事項](#️-跨平台注意事項)
|
||||
- [💡 使用範例](#-使用範例)
|
||||
- [🧩 情境導覽](#-情境導覽)
|
||||
- [範例 1:基本 SSH 密碼](#範例-1基本-ssh-密碼)
|
||||
- [範例 2:多台伺服器](#範例-2多台伺服器)
|
||||
- [範例 3:僅傳送變更檔案](#範例-3僅傳送變更檔案)
|
||||
- [範例 4:整合 Artifacts](#範例-4整合-artifacts)
|
||||
- [範例 5:Windows 伺服器](#範例-5windows-伺服器)
|
||||
- [🗝️ SSH 金鑰設定](#️-ssh-金鑰設定)
|
||||
- [🧰 常見錯誤代碼](#-常見錯誤代碼)
|
||||
- [🔄 工作流程圖](#-工作流程圖)
|
||||
- [FAQ 與疑難排解](#faq-與疑難排解)
|
||||
- [📝 授權條款](#-授權條款)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速開始
|
||||
|
||||
在 GitHub Actions 工作流程中透過 SSH 複製檔案與產物:
|
||||
|
||||
```yaml
|
||||
name: scp files
|
||||
on: [push]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: 透過 SSH 複製檔案
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
password: ${{ secrets.PASSWORD }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 設定說明
|
||||
|
||||
### 🔌 連線設定
|
||||
|
||||
| 變數 | 說明 | 預設值 | 必填 |
|
||||
| --------------- | ------------------------------------ | ------ | ---- |
|
||||
| host | 遠端主機(多台以逗號分隔) | - | ✓ |
|
||||
| port | SSH 連接埠 | 22 | |
|
||||
| username | SSH 使用者名稱 | - | ✓ |
|
||||
| password | SSH 密碼(建議使用金鑰以提升安全性) | - | |
|
||||
| key | SSH 私鑰內容 | - | |
|
||||
| key_path | SSH 私鑰檔案路徑 | - | |
|
||||
| passphrase | SSH 私鑰密碼 | - | |
|
||||
| fingerprint | 主機金鑰 SHA256 指紋驗證 | - | |
|
||||
| protocol | IP 協定:'tcp'、'tcp4' 或 'tcp6' | tcp | |
|
||||
| timeout | SSH 連線逾時 | 30s | |
|
||||
| command_timeout | SCP 指令逾時 | 10m | |
|
||||
|
||||
### 📁 檔案傳輸設定
|
||||
|
||||
| 變數 | 說明 | 預設值 | 安全性說明 |
|
||||
| ---------------- | --------------------------------- | ------ | -------------- |
|
||||
| source | 本地要傳送的檔案/目錄(逗號分隔) | - | 請使用明確路徑 |
|
||||
| target | 遠端目標目錄(必須為目錄) | - | 避免使用根目錄 |
|
||||
| rm | 上傳前移除目標目錄 | - | 請小心使用 |
|
||||
| strip_components | 傳送時移除前置路徑元素 | - | |
|
||||
| overwrite | 使用 tar 覆蓋現有檔案 | - | |
|
||||
| tar_dereference | tar 傳送時跟隨符號連結 | - | |
|
||||
| tar_tmp_path | 目標端 tar 暫存檔路徑 | - | |
|
||||
| tar_exec | 目標端 tar 執行檔路徑 | tar | |
|
||||
| debug | 啟用除錯輸出 | - | |
|
||||
| curl_insecure | curl 使用 --insecure | false | 不建議 |
|
||||
| capture_stdout | 將指令 stdout 作為 action 輸出 | false | |
|
||||
| version | 指定 drone-scp 版本 | - | |
|
||||
|
||||
### 🌐 Proxy 設定
|
||||
|
||||
| 變數 | 說明 | 預設值 | 必填 |
|
||||
| ------------------------- | ------------------------------- | ------ | ---- |
|
||||
| proxy_host | SSH Proxy 主機 | - | |
|
||||
| proxy_port | SSH Proxy 連接埠 | 22 | |
|
||||
| proxy_username | SSH Proxy 使用者名稱 | - | |
|
||||
| proxy_password | SSH Proxy 密碼 | - | |
|
||||
| proxy_key | SSH Proxy 私鑰內容 | - | |
|
||||
| proxy_key_path | SSH Proxy 私鑰檔案路徑 | - | |
|
||||
| proxy_passphrase | SSH Proxy 私鑰密碼 | - | |
|
||||
| proxy_fingerprint | Proxy 主機 SHA256 指紋驗證 | - | |
|
||||
| proxy_use_insecure_cipher | 啟用較不安全的 Proxy 加密演算法 | - | |
|
||||
| proxy_timeout | SSH Proxy 連線逾時 | 30s | |
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ 最佳實踐與安全性
|
||||
|
||||
- **建議優先使用 SSH 金鑰驗證**,提升安全性。
|
||||
- 將所有敏感資訊(host、username、password、key)存放於 **GitHub Secrets**。
|
||||
- 定期**更換部署金鑰**(建議每 90 天一次)。
|
||||
- 限制目標伺服器目錄的寫入權限。
|
||||
- 啟用主機金鑰指紋驗證以防止中間人攻擊。
|
||||
- 避免使用 root 帳號登入 SSH。
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ 跨平台注意事項
|
||||
|
||||
| 情境 | Linux 伺服器 | Windows 伺服器 |
|
||||
| -------- | -------------- | ----------------------- |
|
||||
| 路徑格式 | `/path/to/dir` | `/c/path/to/dir` |
|
||||
| 必要設定 | 無 | `tar_dereference: true` |
|
||||
| 權限 | 保留 | 可能需手動設定 ACL |
|
||||
| Shell | bash (預設) | Git Bash(OpenSSH) |
|
||||
|
||||
> 🚩 **重要提醒:**
|
||||
> 複製到 Windows 伺服器時:
|
||||
>
|
||||
> - 安裝 Git for Windows 並將 OpenSSH 預設 shell 設為 Git Bash
|
||||
> - 使用 Unix 風格目標路徑(如 `/c/Users/...`)
|
||||
> - 啟用 `tar_dereference` 處理符號連結
|
||||
|
||||
---
|
||||
|
||||
## 💡 使用範例
|
||||
|
||||
### 🧩 情境導覽
|
||||
|
||||
- **基本檔案傳輸** → [範例 1](#範例-1基本-ssh-密碼)
|
||||
- **多台伺服器部署** → [範例 2](#範例-2多台伺服器)
|
||||
- **僅傳送變更檔案** → [範例 3](#範例-3僅傳送變更檔案)
|
||||
- **整合 Artifacts** → [範例 4](#範例-4整合-artifacts)
|
||||
- **Windows 伺服器設定** → [範例 5](#範例-5windows-伺服器)
|
||||
|
||||
---
|
||||
|
||||
#### 範例 1:基本 SSH 密碼
|
||||
|
||||
```yaml
|
||||
- name: 透過 SSH 密碼複製檔案
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: example.com
|
||||
username: foo
|
||||
password: bar
|
||||
port: 22
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 範例 2:多台伺服器
|
||||
|
||||
```yaml
|
||||
- name: 複製到多台伺服器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: "foo.com,bar.com"
|
||||
username: foo
|
||||
password: bar
|
||||
port: 22
|
||||
source: "tests/a.txt,tests/b.txt"
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 範例 3:僅傳送變更檔案
|
||||
|
||||
```yaml
|
||||
- name: 取得變更檔案
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v35
|
||||
with:
|
||||
since_last_remote_commit: true
|
||||
separator: ","
|
||||
|
||||
- name: 複製變更檔案到伺服器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.KEY }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: ${{ steps.changed-files.outputs.all_changed_files }}
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 範例 4:整合 Artifacts
|
||||
|
||||
```yaml
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: my-artifact
|
||||
path: world.txt
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: my-artifact
|
||||
path: distfiles
|
||||
|
||||
- name: 複製 artifact 到伺服器
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.KEY }}
|
||||
port: ${{ secrets.PORT }}
|
||||
source: distfiles/*
|
||||
target: your_server_target_folder_path
|
||||
```
|
||||
|
||||
#### 範例 5:Windows 伺服器
|
||||
|
||||
```yaml
|
||||
- name: 複製到 Windows
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.HOST }}
|
||||
username: ${{ secrets.USERNAME }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
port: 22
|
||||
source: "your_source_path"
|
||||
target: "/c/path/to/target/"
|
||||
tar_dereference: true
|
||||
rm: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗝️ SSH 金鑰設定
|
||||
|
||||
1. **產生 SSH 金鑰**(於本地端執行):
|
||||
|
||||
```bash
|
||||
# RSA
|
||||
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||||
# ED25519
|
||||
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
|
||||
```
|
||||
|
||||
2. **將公鑰加入伺服器**:
|
||||
|
||||
```bash
|
||||
cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys'
|
||||
# 或 ed25519
|
||||
cat .ssh/id_ed25519.pub | ssh user@host 'cat >> .ssh/authorized_keys'
|
||||
```
|
||||
|
||||
3. **將私鑰內容複製到 GitHub Secrets**:
|
||||
|
||||
```bash
|
||||
clip < ~/.ssh/id_rsa
|
||||
# 或
|
||||
clip < ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
> 更多細節請參考 [SSH 無密碼登入](http://www.linuxproblem.org/art_9.html)。
|
||||
|
||||
**OpenSSH 注意事項:**
|
||||
若出現 `ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]`,請確認金鑰演算法支援。
|
||||
Ubuntu 20.04+ 可於 `/etc/ssh/sshd_config` 或 `/etc/ssh/sshd_config.d/` 加入:
|
||||
|
||||
```sh
|
||||
CASignatureAlgorithms +ssh-rsa
|
||||
```
|
||||
|
||||
或改用 ed25519 金鑰(預設支援)。
|
||||
|
||||
---
|
||||
|
||||
## 🧰 常見錯誤代碼
|
||||
|
||||
| 錯誤代碼 | 可能原因 | 解決方式 |
|
||||
| -------------- | --------------------- | --------------------------------- |
|
||||
| `ECONNREFUSED` | 連接埠錯誤/防火牆阻擋 | 檢查連接埠與防火牆設定 |
|
||||
| `ENOENT` | 找不到來源檔案 | 請用絕對路徑或檢查 checkout 步驟 |
|
||||
| `EAUTH` | 驗證失敗 | 檢查金鑰格式與權限(需 PEM 格式) |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 工作流程圖
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant G as GitHub Runner
|
||||
participant S as Target Server
|
||||
G->>S: 建立 SSH 連線
|
||||
S-->>G: 驗證憑證
|
||||
G->>S: (可選)移除目標目錄
|
||||
G->>G: 封存來源檔案
|
||||
G->>S: 傳送封存檔
|
||||
S->>S: 解壓與處理檔案
|
||||
S-->>G: 回傳結果
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ 與疑難排解
|
||||
|
||||
- **Q: 為什麼驗證失敗?**
|
||||
A: 請檢查 SSH 金鑰格式、權限,以及金鑰是否已加入伺服器。
|
||||
|
||||
- **Q: 如何只複製變更檔案?**
|
||||
A: 使用 `tj-actions/changed-files` 取得變更檔案並傳給 `source`。
|
||||
|
||||
- **Q: 如何部署到多台伺服器?**
|
||||
A: `host` 參數用逗號分隔多台主機,例如:`host: "foo.com,bar.com"`
|
||||
|
||||
- **Q: 如何複製到 Windows?**
|
||||
A: 設定 Git Bash,使用 Unix 風格路徑,並啟用 `tar_dereference`。
|
||||
|
||||
---
|
||||
|
||||
## 📝 授權條款
|
||||
|
||||
MIT License
|
Loading…
Reference in New Issue
Block a user