Azure Release Pipeline замена моего $

Вопрос или проблема

У меня есть приложение asp.net core, в котором для производственной среды установлено пустое соединение.

Моя цель — изменить его во время развертывания, используя секреты Azure Library.

Мой конвейер релиза вызывает этот метод:

ssh devops@server /usr/bin/docker run -p80:80 --name container1 --network open -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db="User Id=USERX;Password=$(UserXPassword)');Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostora)(PORT=1520))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=xe)))" -d register:5000/imagem01:1

Это не работает, потому что значение $(UserXPassword) внутри моей Azure Library имеет $ посередине, например: Pas$word!Now.
Конвейер возвращает Pas!Now (заменяя $word на пустое значение, так как это воспринимается как переменная Linux).

Мы попробовали почти все, пробуя обернуть переменные в ' и " также. Единственное, что работает до сих пор — это использование моего пароля в Azure Library с Pas\$word!Now.

Если я использую \$ вместо $ в пароле, это работает, но я не считаю это разумным.

Может ли кто-нибудь объяснить, что я упускаю?

ИЗМЕНЕНИЕ

Вот моя задача:

steps:
- script: |
   ssh devops@server /usr/bin/docker image pull register:5000/container01:$(Release.ReleaseName)
   ssh devops@server /usr/bin/docker container stop container01
   ssh devops@server /usr/bin/docker rm -f container01 || true
   ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db=$(ConnectionString) -d register:5000/container01:$(Release.ReleaseName)'
   ssh devops@server /usr/bin/docker image prune -fa || true
  displayName: 'Запустить контейнер'
  env:
    ConnectionString: $(MY_LIBRARY_CONNSTRING)

Чтобы избежать подобных проблем, не прибегая к экранированию специальных символов, таких как $, рассмотрите возможность установки переменных среды на уровне задачи, вместо того чтобы напрямую использовать переменные конвейера (например, из групп переменных) в скриптах.

Пример

Рассмотрим следующую группу переменных с переменной my_connection_string:

Тестовая группа переменных

Использование переменной конвейера непосредственно в скрипте:

trigger: none

pool:
  vmImage: 'ubuntu-latest'

variables:
  - group: group1

steps:
- bash: |
    echo "Строка подключения: $(my_connection_string)"
  displayName: 'Показать строку подключения с использованием переменной конвейера'

Запуск конвейера:

Журнал сборки - использование переменной конвейера

Установка и использование переменной окружения на уровне задачи:

trigger: none

pool:
  vmImage: 'ubuntu-latest'

variables:
  - group: group1

- bash: |
    echo "Строка подключения: $CONNECTION_STRING"
  displayName: 'Показать строку подключения с использованием переменной окружения'
  env: 
    CONNECTION_STRING: $(my_connection_string) # установка переменной окружения из переменной конвейера

Запуск конвейера:

Журнал сборки - использование переменной окружения

Ответ или решение

Ваша задача состоит в том, чтобы обеспечить корректную подстановку секретов из Azure Library в строку соединения вашей ASP.NET Core приложения во время развертывания через Azure Release Pipeline. Проблема заключается в том, что пароль, содержащий символ $, вызывает нежелательное поведение, когда переменные интерпретируются в среде Linux.

Решение проблемы с символом $

Чтобы избежать проблем с интерпретацией символов в значениях переменных, советую использовать переменные окружения на уровне задания, а не прямую подстановку переменных в скрипт. Это поможет избежать конфликтов с интерпретацией переменной $ в командной строке.

Вот как можно переписать вашу задачу, чтобы использовать переменные окружения:

steps:
- bash: |
    ssh devops@server /usr/bin/docker image pull register:5000/container01:$(Release.ReleaseName)
    ssh devops@server /usr/bin/docker container stop container01
    ssh devops@server /usr/bin/docker rm -f container01 || true
    ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db="$CONNECTION_STRING" -d register:5000/container01:$(Release.ReleaseName)'
    ssh devops@server /usr/bin/docker image prune -fa || true
  displayName: 'Run container'
  env:
    CONNECTION_STRING: $(MY_LIBRARY_CONNSTRING) # устанавливаем переменную окружения из библиотеки

Объяснение предложенного решения:

  1. Использование переменной окружения: В секции env мы устанавливаем переменную CONNECTION_STRING, которая берет значение из переменной библиотеки. Затем, в остальной части команд, вместо прямой подстановки $(ConnectionString) мы используем $CONNECTION_STRING. Это позволит избежать конфликтов с интерпретацией символов.

  2. Кавычки: Обертывание значения переменной "$CONNECTION_STRING" в двойные кавычки в вашем ssh-команде позволяет избежать возможных проблем, если строка соединения будет содержать пробелы или специальные символы.

Дополнительные рекомендации:

  • Закрытие секрета: Убедитесь, что храните все секреты, такие как пароли или ключи, в Azure Key Vault или в безопасных переменных в Azure DevOps. Это гарантирует лучшую безопасность ваших соединений.

  • Тестирование: Проверьте процесс развёртывания в тестовом окружении с различными вариантами паролей, включая те, что содержат символы, чтобы убедиться в корректной работе скрипта.

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

Оцените материал
Добавить комментарий

Капча загружается...