如何在 GitHub 操作中将工作目录添加到部署

Posted

技术标签:

【中文标题】如何在 GitHub 操作中将工作目录添加到部署【英文标题】:How to add working directory to deployment in GitHub actions 【发布时间】:2020-02-09 15:20:58 【问题描述】:

我最近进入了 GitHub 操作,所以我想做的是在推送完成后将我的 react 项目托管在 firebase 中。我在这个 CI/CD 过程中使用了 GitHub 操作。这是我现在拥有的 main.yml。

name: Build and Deploy
on:
  push:
    branches:
      - master

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master
      - name: Install Dependencies
        working-directory: ./my-app
        run: npm install
      - name: Build
        working-directory: ./my-app
        run: npm run build

  deploy:
    name: Deploy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master      
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: $ secrets.FIREBASE_TOKEN 

并且我设法在 npm 安装和项目构建时设置了工作目录。但在部署中,我不断收到此错误,

所以我的理解是,这个错误是由于工作目录问题而发生的。所以我现在的项目结构是这样的。

. (root of my GitHub repository)
└── my-app
    ├── firebase.json   <-- Git Hub action must point to this sub-dir
└── my-app-mobile
    ├── packages.json

那么我应该如何在我的 Firebase 部署过程中做到这一点?如果我对问题有误,问题和答案是什么?看来我不能将working-directory: ./my-appuses: 一起使用

【问题讨论】:

为什么不再使用working-directory: ./my-app 它不能和'uses'一起使用 【参考方案1】:

我查看了 firebase CLI 的文档,但没有看到任何通过 CLI 参数设置firebase.json 路径的方法。但是,有一个存储根目录的环境变量。它是在 predeploypostdeploy 钩子的上下文中,所以我不确定 CLI 是否会尊重它。

$PROJECT_DIR — 包含 firebase.json 的根目录

https://firebase.google.com/docs/cli#environment_variables

您使用的 w9jds/firebase-action 只是 CLI 的一个包装器。我不确定这是否可行,但您可以尝试如下设置项目目录。在单独的步骤中设置变量的原因是您无法评估 env 部分中的表达式。有关更多详细信息,请参阅this answer。像w9jds/firebase-action 这样的容器操作将可以访问变量,而无需直接通过env 传递它。

      - name: Set project dir environment var
        run: echo ::set-env name=PROJECT_DIR::"$GITHUB_WORKSPACE/my-app"
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: $ secrets.FIREBASE_TOKEN 

如果这不起作用,另一种方法是 fork w9jds/firebase-action 并在此处向 entrypoint.sh 脚本添加 PROJECT_PATH 参数: https://github.com/w9jds/firebase-action/blob/master/entrypoint.sh

更新: I raised a PR 将PROJECT_PATH 参数添加到w9jds/firebase-action。您现在可以按如下方式使用该操作。

      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: $ secrets.FIREBASE_TOKEN 
          PROJECT_PATH: ./my-app

【讨论】:

为什么不使用 FIREBASE_TOKEN 将其放入 env 映射中? @jonrsharpe 这是因为您无法评估 env 部分中的表达式。 所以给定的解决方案不起作用,我会感谢你的解释。您能否告诉我如何使用分叉的 repo 设置 PROJECT_PATH 以及如何在 GitHub 操作中使用它。至少我也必须尝试一下。 我已经更新了解决方案,说明如何在分叉版本中添加项目路径参数。 所以这是我现在得到的错误 -> “错误:指定的公共目录 'build' 不存在,无法将托管部署到站点 my-app”

以上是关于如何在 GitHub 操作中将工作目录添加到部署的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rails 3应用程序中将gem添加到我的vendor / cache目录?

如何在 Xcode 4 中将新项目添加到源代码管理?

如何将 Jekyll 站点从 github repo 部署到我的 ftp?

如何在wildfly 8.2 Final中将lib添加到模块中?

如何在代码中将子菜单项添加到 ActionBar 操作?

如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称