Синхронизация репозитория GitHub с Конфигурацией приложений
Команды, которые хотят продолжить применять существующие методы системы управления версиями, могут использовать GitHub Actions, чтобы автоматически синхронизировать свой репозиторий GitHub с хранилищем Конфигурации приложений. Это позволяет вносить изменения в файлы конфигурации обычным образом и в то же время использовать приведенные ниже преимущества Конфигурации приложений.
• Централизованная настройка вне кода.
• Обновление конфигурации без повторного развертывания всего приложения.
• Интеграция с такими службами, как Служба приложений Azure и Функции Azure.
Рабочий процесс GitHub Actions определяет автоматизированный процесс в репозитории GitHub. Действие синхронизации Конфигурации приложений Azure активирует обновление экземпляра Конфигурации приложений при внесении изменений в исходный репозиторий. Оно использует файл в формате YAML (YML-файл), находящийся в папке /.github/workflows/
репозитория, чтобы определить шаги и параметры. Вы можете активировать обновления конфигурации при отправке, просмотре или ветвлении файлов конфигурации приложения так же, как для кода приложения.
Документация на сайте GitHub содержит подробные сведения о рабочих процессах и действиях GitHub.
Включение GitHub Actions в репозитории
Чтобы приступить к работе с этим действием GitHub, перейдите в репозиторий и выберите вкладку Actions (Действия). Щелкните New workflow (Создать рабочий процесс), затем выберите Set up a workflow yourself (Настроить рабочий процесс самостоятельно). Наконец, выполните поиск по запросу "Azure App Configuration Sync" в marketplace.
Синхронизация файлов конфигурации после отправки
Это действие синхронизирует файлы Конфигурации приложений Azure при отправке изменения в appsettings.json
. Когда разработчик отправляет изменение в appsettings.json
, действие синхронизации Конфигурации приложений обновляет экземпляр Конфигурации приложений с помощью новых значений.
В первом разделе этого рабочего процесса указано, что действие активируется приотправке изменения, содержащего файл appsettings.json
, в главную ветвь. Во втором разделе перечислены задания, выполняемые после активации действия. Действие получает для изменения соответствующие файлы и обновляет экземпляр Конфигурации приложений, используя строку подключения, сохраненную в качестве секрета в репозитории. Дополнительные сведения об использовании секретов в GitHub см. в статье GitHub о создании и использовании зашифрованных секретов.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your
# repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
Использование строгой синхронизации
По умолчанию действие GitHub не включает строгий режим. Это означает, что при синхронизации в экземпляр Конфигурации приложения только будут добавляться пары "ключ-значение" из файла конфигурации (пары "ключ-значение" не будут удаляться). Включение строгого режима означает, что пары "ключ-значение", отсутствующие в файле конфигурации, будут удалены из экземпляра Конфигурации приложений, чтобы он соответствовал файлу конфигурации. Если вы выполняете синхронизацию из нескольких источников или используете Azure Key Vault с Конфигурацией приложений, вам потребуется применять разные префиксы или метки для строгой синхронизации, чтобы не удалить параметры конфигурации из других файлов (см. примеры ниже).
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your
# repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
label: 'Label'
prefix: 'Prefix:'
strict: true
Синхронизация нескольких файлов одним действием
Если конфигурация хранится в нескольких файлах, можно использовать приведенный ниже шаблон для активации синхронизации при изменении любого из этих файлов. В этом шаблоне используется библиотека glob https://www.npmjs.com/package/glob. Обратите внимание, что если имя файла конфигурации содержит запятую, ее можно экранировать символом обратной косой черты.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
- 'appsettings2.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: '{appsettings.json,appsettings2.json}'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
Синхронизация по префиксу или метке
Если указать префиксы или метки в действии синхронизации, то будет синхронизироваться только набор с этими префиксами или метками. Это важно для строгой синхронизации нескольких файлов. В зависимости от способа настройки конфигурации, можно связать с каждым файлом префикс или метку, а затем синхронизировать их отдельно, чтобы ничего не перезаписать. Обычно префиксы используются для разных приложений или служб, а метки — для различных сред.
Синхронизация по префиксу.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
prefix: 'Prefix::'
Синхронизация по метке.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
label: 'Label'
Использование динамической метки при синхронизации
Приведенное ниже действие вставляет динамическую метку при каждой синхронизации, гарантируя, что каждая операция синхронизации может быть однозначно идентифицирована. Это позволяет сопоставить изменения кода с изменениями конфигурации.
В первом разделе этого рабочего процесса указано, что действие активируется приотправке изменения, содержащего файл appsettings.json
, в главную ветвь. Во втором разделе выполняется задание, которое создает уникальную метку для обновления конфигурации на основе хэша фиксации. Затем это задание обновляет экземпляр Конфигурации приложений с помощью новых значений и уникальной метки этого обновления.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# Creates a label based on the branch name and the first 8 characters
# of the commit hash
- id: determine_label
run: echo ::set-output name=LABEL::"${GITHUB_REF#refs/*/}/${GITHUB_SHA:0:8}"
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your
# repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
label: ${{ steps.determine_label.outputs.LABEL }}
Использование Azure Key Vault с действием GitHub
Разработчики, использующие Azure Key Vault с Конфигурацией приложений, должны использовать два отдельных файла (обычно это appSettings.json и secretreferences.json). Файл secretreferences.json будет содержать URL-адрес секрета хранилища ключей.
{ "mySecret": "{"uri":"https://myKeyVault.vault.azure.net/secrets/mySecret"}" }
После этого можно настроить действие GitHub для строгой синхронизации на основе appSettings.json, за которой последует нестрогая синхронизация на основе secretreferences.json. Следующий пример активирует синхронизацию при обновлении любого из файлов.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
- 'secretreferences.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
strict: true
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'secretreferences.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
contentType: 'application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8'
Использование максимальной глубины для ограничения действия GitHub
Поведение по умолчанию для вложенных атрибутов JSON состоит в том, чтобы преобразовать в плоскую структуру весь объект. Приведенный ниже код JSON определяет пару "ключ-значение".
Клавиши | Значение |
---|---|
Object:Inner:InnerKey | InnerValue |
{ "Object":
{ "Inner":
{
"InnerKey": "InnerValue"
}
}
}
Если вложенным объектом должно быть значение, переданное в экземпляр Конфигурации, можно использовать значение depth, чтобы остановить преобразование в плоскую структуру на соответствующей глубине.
on:
push:
branches:
- 'main'
paths:
- 'appsettings.json'
jobs:
syncconfig:
runs-on: ubuntu-latest
steps:
# checkout done so that files in the repo can be read by the sync
- uses: actions/checkout@v1
- uses: azure/appconfiguration-sync@v1
with:
configurationFile: 'appsettings.json'
format: 'json'
# Replace <ConnectionString> with the name of the secret in your
# repository
connectionString: ${{ secrets.<ConnectionString> }}
separator: ':'
depth: 2
При значении depth, равном 2, приведенный выше пример возвращает следующую пару "ключ-значение":
Клавиши | Значение |
---|---|
Object:Inner | {"InnerKey":"InnerValue"} |
Анализ выходных данных действия
Входные параметры указывают данные, используемые действием во время выполнения. В следующей таблице приведены входные параметры, принимаемые при синхронизации Конфигурации приложений, и ожидаемые значения каждого из них. Дополнительные сведения о входных данных действий GitHub см. в документации на сайте GitHub.
Примечание
Во входных идентификаторах учитывается регистр.
Ввод имени | Обязательно? | Значение |
---|---|---|
configurationFile | Да | Относительный путь к файлу конфигурации в репозитории. Стандартные маски поддерживаются и могут включать в себя несколько файлов. |
format | Да | Формат файла конфигурации. Допустимые форматы: JSON, YAML, properties. |
connectionString | Да | Строка подключения для чтения и записи для экземпляра Конфигурации приложений. Строка подключения должна храниться в качестве секрета в репозитории GitHub, а в рабочем процессе следует использовать только имя секрета. |
separator | Да | Разделитель, используемый при сведении файла конфигурации к парам "ключ-значение". Допустимые значения: . , ; : - _ __ / |
prefix | Нет | Префикс, добавляемый в начало ключей. |
label | Нет | Метка, используемая при настройке пар "ключ-значение". Если значение не указано, используется метка со значением NULL. |
strict | Нет | Логическое значение, определяющее, включен ли строгий режим. Значение по умолчанию — false. |
depth | Нет | Максимальная глубина при преобразовании в плоскую структуру файла конфигурации. Значение глубины должно быть положительным числом. Значение по умолчанию не задает максимальную глубину. |
tags | Нет | Указывает набор тегов для пар "ключ-значение". Ожидаемый формат представляет собой строковую форму объекта JSON следующего вида: { [propertyName: string]: string; }. Каждая пара имени и значения свойства становится тегом. |
Дальнейшие действия
В этой статье вы узнали о действии GitHub для синхронизации Конфигурации приложений и о том, как его использовать для автоматизации обновления экземпляра Конфигурации приложений. Чтобы узнать, как Конфигурация приложений Azure реагирует на изменения в парах "ключ-значение", перейдите к следующей статье.