如何配置 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:如何通过终端访问当前构建的日志