如何配置 GitHub 操作来构建依赖于私有存储库的 Azure 静态 Web 应用程序?

How can I configure GitHub Actions to build my Azure Static Web App with a dependency on a private repository?

我构建了一个 Azure 静态 Web 应用程序,其中包含一个 API 函数,该函数具有一个依赖项。此依赖项位于 GitHub 上的私有存储库中。在我的本地开发机器上,我可以通过使用 SSH 身份验证下载依赖项来构建 Functions 应用程序。尝试使用 GitHub 操作部署到 Azure 时出现错误 Host key verification failed.

我的 GitHub Actions 工作流程类似于 Azure Static Web App 生成的默认工作流程,增加了使用 webfactory/ssh-agent 来促进 GitHub 上的 SSH 身份验证以检索私有存储库 Y 和 运行 步骤与 git clone 用于测试目的:

# ... Same as on https://docs.microsoft.com/en-us/azure/static-web-apps/github-actions-workflow

jobs:
  build_and_deploy_job:
    runs-on: ubuntu-latest
    name: Build and Deploy Job
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
          persist-credentials: false
      - uses: webfactory/ssh-agent@v0.5.1
        with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE }}
      - run: |
          git clone ssh://git@github.com/X/Y.git Z
          ls -la Z
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v0.0.1-preview
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_TOKEN }}
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          action: "upload"
          app_location: "/"
          api_location: "api"
          output_location: "build"

# ... Same as on https://docs.microsoft.com/en-us/azure/static-web-apps/github-actions-workflow

在我的私有存储库 Y 中,我添加了与私钥 secrets.SSH_PRIVATE 关联的 public 密钥作为部署密钥。

在 运行 工作流之后,它显示 git clone 命令是 运行 正确的,因为 ls -la 命令导致显示我的私人存储库中的目录和文件。但是,当 yarn 获取包时,我的 API (yarn install --prefer-offline --production) 的构建过程导致错误 Host key verification failed。结果,GitHub Actions 无法下载我的私有存储库中的依赖项,也无法构建 API。这以失败的工作流程结束。

分析后 Azure/static-web-apps-deploy@v0.0.1-preview 我注意到它使用 Oryx 启动一个 Docker 容器用于 Azure 静态 Web 应用程序的构建过程。此容器不知道在主机 VM 上使用 webfactory/ssh-agent 初始化的 ssh-agent。结果,在 Azure/static-web-apps-deploy@v0.0.1-preview 中触发的 yarn install 无法下载我的私有存储库中的依赖项,导致安装失败。

为了避免这种情况,我重构了我的私有依赖项以将其用作 git submodule instead, because submodules can be loaded prior to the build process using actions/checkout. This was achieved by adding only two extra lines to the workflow file that is generated by Azure Static Web Apps。我在我的工作流文件的以下片段中用尾部 # ADDED 突出显示了这两行:

jobs:
  build_and_deploy_job:
    runs-on: ubuntu-latest
    name: Build and Deploy Job
    steps:
      - uses: actions/checkout@v2
        with:
          ssh-known-hosts: "github.com" # ADDED
          ssh-key: ${{ secrets.SSH_PRIVATE }} # ADDED
          submodules: true
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v0.0.1-preview
...