【问题标题】:Azure Devops Angular Environment VariablesAzure Devops Angular 环境变量
【发布时间】:2020-04-02 14:08:41
【问题描述】:

此时,当 Master 分支发生提交时,构建管道将基于“ng build --prod”生成一个工件,因此该工件使用项目的生产配置。之后,工件将被部署到测试和生产环境。

对于测试环境,我希望代码使用“environment.dev.ts”和生产环境“environment.prod.ts”。我怎样才能做到这一点?

【问题讨论】:

  • 您可以使用不同的命令进行差异构建,例如 prod -> ng build env=prod --prod 和测试 -> ng build env=test --prod。参考这个blog.angulartraining.com/…
  • 嗨,这行不通。因为我正在生成一个我想部署到多个阶段的工件。所以最好的解决方法是在运行时更改值,而不是编译时。使用 Azure Devops,我可以制作多个工件..
  • 那么您实际上是在使用环境文件中的变量吗?
  • 可以,例如:API Url。
  • 对。所以环境文件只在构建阶段使用(基于标志)。你不能交换那些运行时。您有两个选项 - 多个构建管道(具有不同的标志),这样您可以保持当前代码不变或选项 2 - 使用包含环境相关变量的 config.json 并加载该运行时(意味着您必须更改您当前的代码)。

标签: angular azure azure-devops environment-variables azure-pipelines


【解决方案1】:

有很多方法。我正在使用“令牌” 我的生产环境是这样的

export const environment = {
  production: true,
  host: 'https://#{{FLYMARK_MAIN_DOMAIN}}#',
  stripeKey: '#{{STRIPE_KEY}}'
};

所以当我构建我的版本时,我的版本不可用,因为我有令牌而不是变量。

然后,当我发布时,我确实有替换令牌的步骤。这需要在您部署脚本之前运行(只需根据您的需要进行修改)

steps:
- task: qetza.replacetokens.replacetokens-task.replacetokens@2
  displayName: 'Replace tokens in **/Scripts/widgets/**/*.js'
  inputs:
    targetFiles: '**/Scripts/widgets/**/*.js'
    actionOnMissing: fail
    tokenPrefix: '#{{'
    tokenSuffix: '}}#'

此任务将在我的 js 文件中找到我的发布变量,如 FLYMARK_MAIN_DOMAIN、STRIPE_KEY 并替换。

主要好处是您只需构建一次就可以部署到任何需要替换令牌的地方

PS。假设你有开发、登台、产品。现在要在由新推送到 master 触发的构建之后开发您的部署,以便在其批准时暂存您发布(天蓝色管道支持)

所以现在假设您在开发版本 100 中,您决定将其推送到 staging 并且您的团队开始测试。 3 天后,您的开发团队推动掌握了许多新内容,因此在开发时您拥有版本 123,但在暂存时您仍然拥有版本 100。团队在暂存中进行测试后,您会将相同的版本推送到生产中,因为您有信心,如果您愿意的话当您准备好部署到生产环境时,为环境使用单独的构建您在 master 中有很多新东西,也许您没有信心将其推送到生产环境。同样,每种情况都是不同的,有很多方法可以做到,我只是喜欢这种方法,因为它适合我的项目。

【讨论】:

  • 我觉得这很难理解,我想要一个简单的解决方案,有吗?我的意思是,每个人都会遇到这个问题,对吧?多个构建管道呢?
  • 什么是难懂的?那么多个构建管道呢?你熟悉 azure 版本的工作原理吗?
  • 嗯,我的意思是,基于每个环境的多个构建。
  • 我总是有一个构建作为该构建的一部分,我将 Angular 应用程序作为工件,然后我将发布部署到多个环境的版本。我不喜欢按环境构建的想法,它不是错误安全的,如果我们在 dev 中测试,那么应该将相同的版本(只是不同的变量)推送到下一个阶段。
  • 对于那些(像我一样)没有立即理解这个任务来自哪里的人:这实际上是一个 DevOps 扩展。欲了解更多信息,请参阅:marketplace.visualstudio.com/items?itemName=qetza.replacetokens
【解决方案2】:

我的组织不允许在 DevOps 上安装第三方扩展。因此,票数最高的答案是不行。所以我采取了不同的方法。在构建管道中,我创建了两个构建工件:一个用于 QA,一个用于 PROD。在这些构建步骤中使用了不同的环境文件(例如:ng build --c qa)。两者都使用production:true

然后我发布了它们以从发布管道中使用。在 QA 阶段,我将 QA 构建部署到测试服务器。

一旦测试通过并签署晋升为 PROD,我就可以简单地使用 Azure DevOps 批准工作流。当它升级到 PROD 阶段时,我使用 PROD 构建进行部署。

我知道,我没有使用在部署到 PROD 时经过 QA 验证的相同版本。但至少这些构建是在同一个代理上创建的,几乎是同时创建的,所以我想这是一个可以接受的折衷方案。

即使您按照其他答案的建议使用标记器,您仍然会得到一些被篡改的工件 IMO。但话又说回来,这是你必须忍受的事情,因为 Angular 需要烘焙它的配置。所以当涉及到部署时,你总是会在你的环境中以一种或另一种方式推广概念上“不纯”的工件。

【讨论】:

    【解决方案3】:

    您可以将 azure 存储库作为工件添加到发布管道,然后将构建管道任务移动到发布管道中的测试和生产阶段,以分别构建和部署您的应用。检查以下步骤。

    1、进入发布管道编辑页面并点击Artifacts部分中的Add,将您的Azure repo作为工件添加到发布管道中

    2、点击Artifacts部分的Continuous deployment trigger,开启Continuous deployment trigger并设置分支过滤器。

    3、创建阶段Test和阶段Prod。

    4,将您的构建管道任务复制到 Prod 阶段。并运行ng build env=prod --prod 来构建您的应用程序。然后将您的应用部署到 prod 环境。

    .

    5,将您的构建管道任务复制到测试阶段。并运行ng build env=test --prod 来构建您的应用程序。然后将您的应用部署到测试环境。

    希望以上有所帮助。

    【讨论】:

    • 嗨@M Yil 您是否尝试过上述步骤。进展如何?如果有任何问题,请告诉我。
    • 构建应该发生在构建阶段,而不是发布阶段。这里的整个问题是设置因环境而异的发布时间设置(例如机密和密钥)。
    • 这个答案对我有用。不知道为什么有人会想要安装 3rd 方,如果你不需要的话。 ng build --configuration 开发,ngbuild --configuration 生产。应该很好很容易。
    猜你喜欢
    • 2020-01-15
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-08-21
    • 1970-01-01
    • 2019-10-09
    • 2021-01-19
    相关资源
    最近更新 更多