fel*_*osh 19 ssh github-actions
我在 DO 上有一个临时服务器。
我想为它构建和部署我的节点应用程序。
name: Build & Deploy
on:
push:
tags:
- 'v1.*.0'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Create SSH key
run: |
mkdir -p ~/.ssh/
echo "$DO_GITHUB_PRIVATE_KEY" > ../github_do.key
sudo chmod 600 ../github_do.key
ssh-keyscan -H ${{secrets.DEPLOY_SERVER}} > ~/.ssh/known_hosts
shell: bash
env:
DO_GITHUB_PRIVATE_KEY: ${{secrets.DO_GITHUB_PRIVATE_KEY}}
- uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Install Packages
run: yarn install --frozen-lockfile
- name: Build artifacts
env:
DEPLOY_SSH_KEY_PATH: ${{ github.workspace }}/../github_do.key
run: |
yarn shipit production fast-deploy
Run Code Online (Sandbox Code Playgroud)
我所做的是生成一个新的 SSH 私钥和公钥。
我保存在github secret 中的私钥DO_GITHUB_PRIVATE_KEY
。
该公共密钥我已经添加到authorized_keys
我的临时服务器上。
当动作被触发时,它会失败:
@ v***.256.0
Create release path "/home/***/***/releases/2020-03-0***-v***.256.0"
Running "mkdir -p /home/***/***/releases/2020-03-0***-v***.256.0" on host "***".
@***-err ***@***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
'fast-deploy:updateRemote' errored after ***.32 s
Error: Command failed: ssh -i /home/runner/work/***/***/../github_do.key ***@*** "mkdir -p /home/***/***/releases/2020-03-0***-v***.256.0"
Run Code Online (Sandbox Code Playgroud)
fel*_*osh 28
我已经解决了!显然,密钥是用 passphrase 保护的。
这是整个过程:
ssh-keygen -t rsa -b 4096 -C "user@host" -q -N ""
更新您的主机 authorized_keys
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
进入服务器并运行
ssh-keyscan host
在您的工作流.yml 文件中
#workflow.yaml
...
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Create SSH key
run: |
mkdir -p ~/.ssh/
echo "$SSH_PRIVATE_KEY" > ../private.key
sudo chmod 600 ../private.key
echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
shell: bash
env:
SSH_PRIVATE_KEY: ${{secrets.SSH_PRIVATE_KEY}}
SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}
SSH_KEY_PATH: ${{ github.workspace }}/../private.key
Run Code Online (Sandbox Code Playgroud)
然后你可以使用 ssh ssh -i $SSH_KEY_PATH user@host
希望这会为某人节省几个小时:]
为了添加 github 机密,您有 2 个选项:
.env
文件同步(预操作触发器)tou*_*rrr 19
felixmosh和Cas的答案,但这感觉是一个更好的实现。无需将known_hosts
文件上传到 Github 托管的运行器,只需~/.ssh/known_hosts
在运行时填充文件即可。更灵活,因为它可以处理 IP 更改等问题。我测试了它,它对我有用。
- name: Write SSH keys
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
ssh-keyscan -H host.example.com > ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好,
- name: Write SSH keys
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
host='host.example.com'
hosts="$(dig +short "$host" | grep -v '\.$' | sed -z 's|\n|,|g')$host"
ssh-keyscan -H "$hosts" > ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
这可以确保主机的所有 ip 都记录在known_hosts
.
只需更换host.example.com
即可。
Cas*_*Cas 16
felixmosh 的答案很有用,但我设法进一步简化它,使用 id_rsa
它将自动使用,ssh
并且秘密将被替换,而不需要中间环境变量:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v2
with:
name: build
path: build
- name: Create SSH key
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts
- name: Deploy with rsync
run: rsync -rav --delete build/ user@host:/
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14616 次 |
最近记录: |