【问题标题】:Github actions - how to deploy to remote server using SSHGithub 操作 - 如何使用 SSH 部署到远程服务器
【发布时间】:2020-06-14 01:16:59
【问题描述】:

我在 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

我所做的是生成一个新的 SSH 私钥和公钥。

我保存在DO_GITHUB_PRIVATE_KEY github secret 中的私人密钥。

public 密钥已添加到暂存服务器上的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"

【问题讨论】:

    标签: ssh github-actions


    【解决方案1】:

    我已经解决了! 显然密钥是用密码保护的 ?。

    这是整个过程:

    1. 生成新密钥

    ssh-keygen -t rsa -b 4096 -C "user@host" -q -N ""

    1. 更新主机的authorized_keys

      ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

    2. 进入服务器并运行

    ssh-keyscan host

    1. 将输出复制到 github secret(我们称之为 SSH_KNOWN_HOSTS)
    2. 将私钥复制到 github 机密(我们称之为 SSH_PRIVATE_KEY)

    在您的 workflow.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
     
    

    然后你可以使用 ssh 和ssh -i $SSH_KEY_PATH user@host

    希望这可以为某人节省几个小时:]

    编辑

    对cmets的回答(如何更新github secret)

    要添加 github 机密,您有 2 个选项:

    1. 通过 GitHub 用户界面,https://github.com/{user}/{repo}/settings/secrets/
    2. 通过 GitHub API,我使用 github-secret-dotenv lib 将我的秘密与我的本地 .env 文件同步(预操作触发器)

    【讨论】:

    • 虽然我喜欢这种方法,但这似乎意味着在项目中拥有私钥。我建议添加 gpg 技巧以避免将普通密钥放入项目中,如help.github.com/en/actions/configuring-and-managing-workflows/… 中所述
    • 不在源码中,而是保存在github secrets里面
    • 哦,我明白了,您能否详细说明一下您是如何在其中放置/读取的?,我在尝试使用它时遇到了“格式无效”错误
    • 我已经在我的 anwser 中添加了这个
    • 我收到了mkdir -p ~/.ssh/ ##[error]No such file or directory。知道为什么吗?
    【解决方案2】:

    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:/
    

    【讨论】:

      【解决方案3】:

      felixmoshCas 的答案,但这感觉像是一个更好的实现。无需将 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
      

      或者,甚至更好,

      - 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
      

      这样可以确保主机的所有ip都记录在known_hosts中。

      只需替换 host.example.com 即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2022-06-27
        • 2021-03-27
        • 2012-07-01
        • 2020-01-27
        • 1970-01-01
        • 2021-12-20
        相关资源
        最近更新 更多