这几天,我一直在捣鼓这个,发现这个实在太强大了。后面我在想,既然是一个服务器,那就应该能实现远程连接进行交互式操作啊。

果不其然,百度了一圈,发现已经有人实现了

前言

Github Actions 一个拥有 E5 2vCPU/​7G RAM/​90G SSD 配置的 VPS。参考 @p3terx 的虚拟服务器评测

方案一

项目地址:mxschmitt/action-tmate

第一个实现 tmate 连接 Ac­tions 的 ac­tion ,但此方案在退出连接后不能进行到下一个步骤,所以在实际使用中没有多少价值,只能用于 SSH 连接。不过由于其开天辟地的作用,我决定把它放到第一位

work­flow 文件示例:

1
2
3
4
5
6
7
8
9
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup tmate session
uses: mxschmitt/action-tmate@v1

方案二

项目地址:csexton/debugger-action

此 ac­tion 作者受 mxschmitt/action-tmate 启发,同样是通过 tmate 连接,退出连接后可持续进行下一个步骤,能更好的应用到实际项目中使用。作者可能考虑到为 GitHub 节约资源,默认加了 15 分钟自动断开连接,不过可以通过执行 touch /tmp/keepalive 命令去解除

work­flow 文件示例:

1
2
3
4
5
6
7
8
name: Ubuntu
on: push
jobs:
Ubuntu:
runs-on: ubuntu-latest
steps:
- name: Setup Debug Session
uses: csexton/debugger-action@master

方案三

项目地址:P3TERX/debugger-action

此方案是由 @P3TERX 根据方案二改进,部分提示文案的显示逻辑,修改连接超时为 30 分钟,解决了失去控制的问题

work­flow 文件示例:

1
2
3
4
5
6
7
8
9
10
 name: Ubuntu
on:
watch:
types: started
jobs:
Ubuntu:
runs-on: ubuntu-latest
steps:
- name: SSH connection to Actions
uses: P3TERX/debugger-action@master

方案四(推荐)

此方案是博主我根据 网友XXX 改进而来的,该方案没有使用 action 来实现,而是另辟蹊径,直接使用 ngrok 来穿透内网

请先在 Github 项目中创建所需的 Secret 参数

名字描述
NGROK_TOKENstringngrok 的官网 生成的 Authtoken
NGROK_SCRIPTstring自定义代码脚本,参考下方
USER_PASSstringSSH连接时将使用的密码

自定义代码脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash


if [[ -z "$NGROK_TOKEN" ]]; then
echo "请先设置名为 'NGROK_TOKEN' 的Secrets"
exit 2
fi

if [[ -z "$USER_PASS" ]]; then
echo "请先设置名为 'USER_PASS' 的Secrets"
exit 3
fi

echo "### 安装 ngrok ###"

wget -q https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-386.zip
unzip -q ngrok-stable-linux-386.zip
chmod +x ./ngrok

echo "### 设置 $USER 用户密码 ###"
echo -e "$USER_PASS\n$USER_PASS" | sudo passwd "$USER"

echo "### 启动 ngrok 端口代理 ###"

rm -f .ngrok.log
./ngrok authtoken "$NGROK_TOKEN"
./ngrok tcp 22 --log ".ngrok.log" &

sleep 10
HAS_ERRORS=$(grep "command failed" < .ngrok.log)

if [[ -z "$HAS_ERRORS" ]]; then
echo ""
echo "================SSH 账号信息==================="
echo "To connect: $(grep -o -E "tcp://(.+)" < .ngrok.log | sed "s/tcp:\/\//ssh $USER@/" | sed "s/:/ -p /")"
echo "=============================================="
else
echo "$HAS_ERRORS"
exit 4
fi

该自定义代码脚本用来为 SSH 服务建立 TCP 隧道,并打印出通过公网连接远程服务器的命令

紧接着,创建如下的 workflow:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
name: 开启 SSH 支持
on:
watch:
types: started

jobs:
build:
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id

steps:
- uses: actions/checkout@v1


- name: 尝试破坏构建过程
run: ./hello-world.sh

- name: 通过 ngrok 启动 ssh
if: ${{ failure() }}
env:
NGROK_TOKEN: ${{ secrets.NGROK_TOKEN }}
NGROK_SCRIPT: ${{ secrets.NGROK_SCRIPT }}
USER_PASS: ${{ secrets.USER_PASS }}
run: |
echo "$NGROK_SCRIPT" &> run.sh
bash run.sh

- name: 设置 ssh 存活时间
if: ${{ failure() }}
run: sleep 1h

服务器存活时间默认是 1 小时,可自行调整,1 小时候需要重新连接

项目作者点击 Star 就可以运行了