我有一个 github 工作流程,应该通过 SSH 登录到远程服务器,然后从私有 github 存储库下载 docker-compose 文件。
我首先努力为工作流 yaml 文件中的运行部分获取正确的多行字符串语法,特别是curl命令,因为它需要标题的引号。我找到的解决方案是将curl命令拆分到环境变量中。
download-file:
name: download file
runs-on: ubuntu-latest
steps:
- name: install ssh keys
# check this thread to understand why its needed:
# <https://stackoverflow.com/a/70447517>
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
host='${{ secrets.SSH_HOST }}'
hosts="$(dig +short "$host" | grep -v '\.$' | sed -z 's|\n|,|g')$host"
ssh-keyscan -H "$hosts" > ~/.ssh/known_hosts
- name: download docker compose file from private repo to server
run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}
"ls -la
&& cd test
&& ls -la
&& curl -v -H $CURL_H1 -H $CURL_H2 -H $CURL_H3 -o $CURL_O $CURL_URL
&& exit"
env:
CURL_H1: '"\"Authorization: Bearer ${{secrets.PULL_ACCESS_TOKEN}}\""'
CURL_H2: '"\"Accept: application/vnd.github.v3.raw\""'
CURL_H3: '"\"Content-Type: text/html; charset=UTF-8\""'
CURL_O: "docker-compose.yml"
CURL_URL: "https://raw.githubusercontent.com/<username>/<repository name>/refs/heads/main/docker-compose.prod.yml"
- name: cleanup
run: rm -rf ~/.ssh
问题:
当我手动登录服务器后执行curl命令时,文件被下载并且我可以打开它,没有问题。
在 github 工作流程中,curl 请求也执行时没有任何错误,但是当我手动 ssh 到服务器后尝试通过
docker-compose.yml
打开下载的文件 cat docker-compose.yml
时,无法打开文件并显示消息 found an invalid character in header name
而是显示。
我的猜测是变量的字符串格式存在某种问题。我已经花了几个小时尝试各种字符串格式,用反斜杠转义双引号以保留双引号。老实说,字符串语法对我来说看起来已经相当复杂了。
问题:
如何在 ssh 进入服务器后运行 curl 请求,从私有 github 存储库下载单个 docker-compose 文件而不损坏文件,以便实际上可以打开文件? 分别考虑到
run
变量的字符串格式,env
中的curl命令语法格式是否存在问题,如果是这样,更好/正确的方法是什么?
感谢您的帮助!
出现此问题的原因是 $CURL_H1、$CURL_H2、$CURL_H3 等环境变量是在 GitHub Actions 运行器环境中定义的,但在远程 SSH 会话中不可用。