Развертывание приложения Vue.js с использованием конвейера выпуска Azure DevOps

У меня есть приложение vue.js, которое создается и строится с использованием vue-cli 3. У меня есть несколько переменных среды в файлах .env.test и .env.prod.

Для создания приложения я использую конвейер сборки azure DevOps, в котором я запускаю команду: npm run build:test или npm run build:prod

Это создает различные артефакты, которые вводятся для Stage в конвейере выпуска azure DevOps.

Проблема, с которой я столкнулся, заключается в том, что я не хочу иметь отдельные сборки для каждой среды. Я хочу создать один и развернуть его в разных средах, возможно ли это?

Как мне обработать эти переменные, чтобы собрать один пакет для всех сред? Это хорошая практика? Или у меня должны быть разные конвейеры для разных сред, как сейчас?


person chamix    schedule 22.05.2019    source источник
comment
Для достижения цели не нужно использовать несколько конвейеров. Вы спрашиваете, как настроить сборку так, чтобы она выводила папку с артефактами test и prod?   -  person Steve L.    schedule 23.05.2019
comment
Вы когда-нибудь догадывались об этом? У меня такая же проблема.   -  person alec    schedule 12.09.2019
comment
Эй, алек, нет, я никогда не догадывался. Я просто перестал использовать конвейеры выпуска Azure и перехожу к созданию конвейеров сборки, где у меня есть несколько задач AWS, которые выполняют развертывание.   -  person chamix    schedule 14.09.2019
comment
@chamix дайте мне знать, поможет ли вам мой ответ ниже, в противном случае я мог бы расширить ответ, указав более подробную информацию   -  person Serhii Kyslyi    schedule 26.09.2019


Ответы (2)


С точки зрения CI

Должен быть только один build pipeline, который будет создавать артефакт независимо от среды, в которой он будет работать.

.env.prod можно использовать для развертывания артефактов в любых средах (Development, Production и т. Д.)

Вы должны предоставить конфигурацию с токенами, которые будут заменены на этапе развертывания / выпуска:

env_key1=#{token_key1}#
env_key2=#{token_key2}#
env_key3=#{token_key3}#

Поэтому просто соберите проект и опубликуйте артефакт, используя единый файл конфигурации для всех сред.

С точки зрения CD

Я бы рекомендовал использовать одиночный release pipeline с несколькими этапами (Development, Production и т. Д.). введите описание изображения здесь

Предоставьте отдельный variables groups на основе stages. Это позволяет хранить переменные отдельно, логически сгруппировать и использовать Azure Key Vault как источник секретов. Имена переменных должны совпадать с токенами среды (без префикса и суффикса).

введите описание изображения здесь

Добавьте любые Task в Stage, который найдет и заменит жетоны.

В настоящее время я использую расширение Replace Tokens из магазина. В зависимости от stage будет подставлена ​​другая группа переменных. Replace Tokens задача выполняет всю работу автоматически, например. сканирует js файлы и заменяет токены. Префикс и суффикс токена по умолчанию: #{ }#, но задача позволяет указать желаемый вариант. введите описание изображения здесь

person Serhii Kyslyi    schedule 25.09.2019
comment
Это решение также работает для файла config.js после сборки? Мне интересно, как установить разные API для этапов развертывания. - person Christoph; 04.02.2021

Итак, у нас была похожая проблема. Мы собираемся обновить наше решение для работы с группой переменных, но если вам нужен способ обойтись без нее, вы всегда можете сделать что-то вроде этого:

- script: |
    npm install
    npm run test:unit
    if [ $? -ne 0 ]; then
        exit 1
    fi
    npm run build-prod
  condition: and(succeeded(), not(in(variables['Build.Reason'], 'PullRequest', 'Manual')))
  displayName: 'npm install, test and build for prod'

- script: |
    npm install
    npm run test:unit
    if [ $? -ne 0 ]; then
        exit 1
    fi
    npm run build
  condition: and(succeeded(), in(variables['Build.Reason'], 'PullRequest', 'Manual'))
  displayName: 'npm install, test and build for test'

Так что краткая разбивка по сценариям. Если сборка была частью PullRequet или руководства, нам нужна промежуточная сборка, в которой используется сценарий сборки по умолчанию. В противном случае мы предполагали, что сборка предназначена для производства (вам понадобятся некоторые политики веток, чтобы обеспечить это). Затем конвейер выпуска проверил тег сборки, который мы установили следующим образом:

- task: PowerShell@2
  condition: and(succeeded(), not(in(variables['Build.Reason'], 'PullRequest', 'Manual')))
  inputs:
    targetType: 'inline'
    script: 'Write-Host "##vso[build.addbuildtag]release"'

- task: PowerShell@2
  condition: and(succeeded(), in(variables['Build.Reason'], 'PullRequest', 'Manual'))
  inputs:
    targetType: 'inline'
    script: 'Write-Host "##vso[build.addbuildtag]test"'

Теперь, как я уже сказал, мы отходим от этого, но он работал довольно хорошо и позволил нам иметь одну сборку, которая будет развернута с правильными настройками без необходимости делать что-то слишком сложное.

Если вы используете что-то подобное, последний шаг - фильтровать сборки, когда они попадают в конвейер выпуска, на основе тега сборки и ветки.

person rahicks    schedule 17.12.2019
comment
Это не будет работать с выпуском только сборки - person Nick Turner; 19.03.2021