如何使用 Github Actions 通过 SSH 连接到 Ubuntu 服务器并使用另一组 SSH 密钥提取私有 Github 仓库?

如何使用 Github Actions 通过 SSH 连接到 Ubuntu 服务器并使用另一组 SSH 密钥提取私有 Github 仓库?
  1. 我有以下服务器:Ubuntu v22.04.1(Linux)和 LEMP(PHP v5.6(我知道它很旧,但旧版应用程序需要它)、MySQL v8.0.36 和 Nginx)。
  2. 我还有一个私人 GitHub 存储库,里面有我想放在我的 Ubuntu 服务器上的应用程序代码。
  3. 我想使用 Github Actions 通过 SSH 连接到 Ubuntu 服务器,并使用 SSH 连接到私有仓库并在主分支每次获得推送时提取代码。

这是我的 .yaml 文件中的代码,GitHub Actions 使用它来连接 Ubuntu 服务器并提取 GitHub 仓库代码(这是我正在努力的部分)。

# Workflow to deploy code to the Ubuntu LEMP server every time there's a push to the main branch.
name: Deploy to Ubuntu Server

# Control when the actions happen.
on:
  # Triggers the workflow on push or pull request events but only for the main branch.
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab.
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel.
jobs:
  # This workflow contains a single job called "deploy".
  deploy:
    name: Deploy
    # The type of runner that the job will run on.
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job.
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it.
      - name: Checkout code
        uses: actions/checkout@v4

      ## Deploy using SSH to server
      - name: Execute remote SSH commands and deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd ${{ secrets.REMOTE_PATH }} &&
            git init &&
            git pull origin main [email protected]:<username>/<repo-name>.git &&
            git pull origin main &&
            php cli/migrate.php -v -d &&
            php cli/migrate.php -v &&
            rm -Rf shared/cache &&
            ln -nfs shared/cache files &&
            rm -Rf Capfile &&
            rm -Rf config/deploy* &&
            rm -Rf .gitignore &&
            rm -Rf .git &&
            rm -Rf README.md &&
            php cli/update_revision.php &&
            php cli/update_crontab.php &&
            mkdir -p shared/certs &&
            mkdir -p shared/files &&
            mkdir -p shared/cache &&
            touch shared/config.php &&
            if [ -d shared/pids ]; then rmdir shared/pids; fi &&
            if [ -d shared/system ]; then rmdir shared/system; fi &&
            if (crontab -l | grep -q LEAF_PRODUCTION=1); then echo /dev/null; else { crontab -l; echo "LEAF_PRODUCTION=1"; } | crontab -; fi &&
            if (grep -q LEAF_PRODUCTION=1 ~/.profile); then echo /dev/null; else echo "export LEAF_PRODUCTION=1" >> ~/.profile; fi

问题出在这部分代码上

git pull origin main [email protected]:<username>/<repo-name>.git &&

我需要使用两组SHH密钥。

  • 一套用于连接 Ubuntu 服务器(我已将公钥放在服务器中,私钥存储为 GitHub 密钥)这部分代码有效。
  • 另一个是连接到私有 GitHub repo 并在那里克隆代码(基本上相反,私钥在服务器上,但公钥存储为私有 GitHub repo 部署密钥)。

连接到 Ubuntu 服务器是可行的,但我不明白如何为代码提​​供第二组 SHH 密钥来连接和克隆 GitHub 存储库。现在编写代码的方式,它仅使用第一组 SHH 密钥连接到 Ubuntu 服务器。

答案1

在等待评论时我尝试了不同的方法并且成功了。

  1. 我没有使用 SSH,而是尝试创建一个 Github 访问令牌,该令牌提供对该存储库的访问,但容量有限。您可以在 GitHub 个人资料设置 >> 开发人员设置 >> 个人访问令牌 >> 细粒度个人访问令牌中完成此操作。
  2. 我获取了访问令牌并将其添加到我的 Github Action 机密中。
  3. 我使用该密钥从以下 HTTPS URL 生成并提取代码:https://:<access_token>@github.com//<repo_name>.git

这种方法的问题在于,为了使它工作,我必须放弃 SSH。我相信有一种方法可以解决 SSH 问题,但目前,我的解决方案有效。

相关内容