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

Posted

技术标签:

【中文标题】如何配置 GitHub Actions 以构建依赖于私有存储库的 Azure 静态 Web 应用程序?【英文标题】:How can I configure GitHub Actions to build my Azure Static Web App with a dependency on a private repository? 【发布时间】:2021-06-27 21:14:55 【问题描述】:

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

我的 GitHub Actions 工作流类似于 Azure 静态 Web 应用生成的默认工作流,除了使用 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 关联的公钥添加为部署密钥。

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

【问题讨论】:

构建过程(使用 yarn 命令)是否在另一个步骤中执行?如果是,请在执行命令之前检查目录,看看您是否仍在预期的目录中。我最近用git做了类似的事情,每一步都必须进入目录执行操作。 感谢您的回复!不,构建过程包含在 Azure/static-web-apps-deploy@v0.0.1-preview 中,因此与我启动 ssh-agent 的步骤相同。 我在另一个主题中发现这可能是因为使用git@github.com:... 语法最终使用SSH 进行克隆,并且在容器内部,您的私钥可能不可用。在这种情况下,您可能希望改用 RUN git clone https://github.com/x/y.git(来源(即使不同):github.com/docker-library/golang/issues/148)。 谢谢,我认为这将我推向了正确的方向。作为 GitHub Actions 的新手,我没有意识到 Azure/static-web-apps-deploy@v0.0.1-preview 操作会启动 Docker 容器。这个容器确实不知道在主机 VM 上运行的webfactory/ssh-agent。现在要弄清楚如何在容器中轻松“注入”主机密钥和我的私有 SSH 密钥...... 【参考方案1】:

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

为了避免这种情况,我重构了我的私有依赖项以将其用作git submodule,因为可以在构建过程之前使用actions/checkout 加载子模块。这是通过在Azure Static Web Apps 生成的工作流文件中仅添加两行额外的行来实现的。在我的工作流文件的以下 sn-p 中,我用尾随 # 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
...

【讨论】:

以上是关于如何配置 GitHub Actions 以构建依赖于私有存储库的 Azure 静态 Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

GitHub Actions:如何通过终端访问当前构建的日志

如何在 Github Actions 工作流中从 Github 包访问 Maven 依赖项?

如何在 GitHub Actions 中使用最新发布标签?

GitHub Actions:如何像合并一样构建拉取请求?

如何在本地运行 GitHub Actions 工作流程?

如何使用 GitHub Actions 对构建工件进行版本化?