【问题标题】:github actions: pull and deploy private repo to VPSgithub 操作:拉取私有仓库并将其部署到 VPS
【发布时间】:2022-06-28 01:10:41
【问题描述】:

每当我将更改推送到我的主分支时,我想在我的 VPS 上自动部署我的私有存储库。我的 yaml 文件如下所示:

name: push-and-deploy-to-server

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: checkout repo
        uses: actions/checkout@v2
      - name: ssh and deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |
            git pull origin main
            git status
            npm install --only=prod
            pm2 restart index.js

这不起作用,我收到以下错误:

err: fatal: could not read Username for 'https://github.com': No such device or address

当 ssh 进入我的服务器并自己克隆 repo 时,它会询问我的用户名和密码(访问令牌)。当我提供它时,它可以工作,但是对于 yaml 文件,它就不行了。

如何克隆和部署私有仓库?顺便说一句,这是一个 nodejs 项目。

【问题讨论】:

  • 您是否尝试将 ouath-key 添加为用户名,但未通过?
  • 您的with 行提供ssh 身份验证数据。然后你告诉你的 Git 使用 https 而不是 ssh,所以 Git 不使用 ssh,并且 ssh 不使用提供的身份验证数据,并且 libcurl 尝试从不存在的用户,并且由于那里没有用户而失败。要么提供 https 身份验证数据,要么使用 ssh url。

标签: node.js git github-actions


【解决方案1】:

考虑您的设置

  1. 私有 GitHub 存储库,对该存储库具有给定的操作。
  2. VPS

您当前的配置和 github 机密设置是做什么的?

  1. 您将代码推送到您的私人仓库
  2. 动作运行并在您的 VPS 中使用 appleboy/ssh-action@master ssh
  3. 然后在您的 VPS 中执行您的命令,例如 git pull origin main

您的问题是您的 VPS 未经过身份验证以访问您的存储库。

您有多种选择。

  1. 以用户${{ secrets.SSH_USERNAME }} ssh 到您的VPS,并使用您可以在https://github.com/settings/tokens 下生成的Github 个人访问令牌对github 验证该用户,并为其授予读取回购权限。然后测试您是否可以将您的 repo 克隆到 VPS,如果可以,那么您的下一个构建将成功。
  2. 第二个选项在 VPS 中为${{ secrets.SSH_USERNAME }} 生成新的 ssh 密钥并将其添加到您的存储库设置下部署密钥。使用部署密钥时,您需要确保您在 vps 中的远程仓库使用的是git@github.com:<username>/<repository>.git git url 而不是https url。
  3. 第三个选项:在appleboy/ssh-action之前使用appleboy/scp-actionstep并将当前目录中的所有内容复制到您的VPS,然后使用appleboy/ssh-action运行您的npm install等。

【讨论】:

    【解决方案2】:

    如果您在服务器上安装了 git,您可以继续操作。但是scp project 也可以直接将代码部署到你的服务器上。

    name: push-and-deploy-to-server
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      build-and-deploy:
        runs-on: ubuntu-latest
        steps:
          - name: checkout repo
            uses: actions/checkout@v2
          - name: ssh and deploy
            uses: appleboy/ssh-action@master
            with:
              host: ${{ secrets.SSH_HOST }}
              username: ${{ secrets.SSH_USERNAME }}
              key: ${{ secrets.SSH_PRIVATE_KEY }}
              source: "."
              target: "the/server/path"
    

    我使用 IP 地址而不是域名,因为我觉得我的托管服务在搞砸我。 Check out this URL for more details

    【讨论】: