Это старая как время сказка, что, будучи инженером-программистом, вы пишете код, довольны им, а затем предоставляете его. Конец истории, правда? Больше нечего делать! Как обычно, есть еще много слоев, с которыми нужно иметь дело, и один из них - обслуживание…
Я знаю, что это не самая удивительная тема, о которой можно писать, но она решает реальную проблему для меня, и я надеюсь на некоторых из вас.
Я бэкэнд-инженер и много пишу на C #, а это значит, что я получаю решения, основанные на пакетах NuGet. Их нужно постоянно обновлять, потому что есть другие инженеры, которые проделывают потрясающую работу по поддержанию своих пакетов в актуальном состоянии, а мне нравится поддерживать свои зависимости в актуальном состоянии. Вот где я нахожусь с проблемой создания ветки, обновления пакетов, фиксации их, а затем получения одобрения PR, просто чтобы получить некоторые незначительные обновления. Это раздражает, и я хочу это решить.
Прежде чем мы начнем, эти инструкции мне подходят?
Если вы в деле, пора поработать здесь со мной. Действия можно использовать для запуска многих рабочих процессов. Наиболее распространенными являются конвейеры сборки и выпуска для вашего проекта. Ответ на нашу проблему также находится в действии. Пришло время создать новую.
Это самая простая часть, эта акция будет выполняться раз в неделю. Вы можете изменить расписание на все, что захотите. GitHub Action работает не вовремя, но запускается. Чтобы узнать больше о запланированных заданиях и настройке расписаний, прочтите документацию GitHub и ознакомьтесь с примерами на Crontab Guru.
name: Automated Dependency Updates
on:
schedule:
- cron: '0 0 * * 0'
Далее мы настраиваем работу. Здесь мы определяем, какие шаги мы хотим выполнить. Мы выполняем эту работу на последней версии Ubuntu. Затем мы настраиваем шаг
по умолчанию, а также actions/checkout
для установки версии .NET SDK, необходимой для нашего решения. Для этой работы мне нужен .NET 6. Вы должны заметить измененный токен для оформления заказа actions/setup-dotnet
, это пригодится на шаге 5, я объясню, что там внизу.AUTOMATED_DEPENDENCY_UPDATES_TOKEN
dependencies:
name: Update Dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.AUTOMATED_DEPENDENCY_UPDATES_TOKEN }}
- name: Setup
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
Это основные шаги обновления наших пакетов NuGet. Во-первых, нам нужно установить устаревший инструмент dotnet, а затем проверить, нужно ли нам предпринимать какие-либо дальнейшие действия. Если мы запустим
и нет пакетов для обновления, мы должны отменить остальные шаги в этом задании.dotnet outdated
Это делается, но на этапе проверки устанавливается выходная переменная, которая может использоваться на всех других этапах задания, чтобы определить, следует ли его запускать или нет. Если никаких обновлений не требуется, мы устанавливаем для выходной переменной значение
.false
Если у нас есть обновления для их создания, мы запускаем
для принудительного обновления NuGet. В случае успеха мы устанавливаем для выходной переменной значение dotnet outdated -u
true
, чтобы можно было выполнить следующие шаги.
- name: Tools
id: tools
run: dotnet tool install --global dotnet-outdated-tool
- name: Update
id: update
run: |
OUTPUT=$(dotnet outdated)
if [[ $OUTPUT =~ "No outdated dependencies" ]]; then
echo "::set-output name=updated::false"
else
dotnet outdated -u
echo "::set-output name=updated::true"
fi
shell: bash
После обновления пакетов NuGet вам необходимо убедиться, что изменения не нарушили ваш код. Лучший способ сделать это - создать и протестировать свое решение. Это простая команда
для запуска всех тестов решения. Вы можете обновить этот оператор в соответствии с вашими потребностями, по умолчанию должны выполняться все ваши тесты.dotnet test
- name: Test
id: test
if: ${{ steps.update.outputs.updated == 'true' }}
run: dotnet test -c Release -v minimal
Последним шагом является фиксация, а затем отправка обновлений пакета NuGet, если тесты пройдены, этот шаг выполняется, и ваше автоматическое обновление пакета завершается. Когда мы использовали
на этапе оформления заказа, это было сделано для того, чтобы обойти тот факт, что встроенный AUTOMATED_DEPENDENCY_UPDATES_TOKEN
не запускает последующий рабочий процесс. Если вы создаете специальный токен личного доступа для использования при извлечении кода, то после отправки кода, если у вас есть другой автоматизированный рабочий процесс, он сработает.GITHUB_TOKEN
Наконец, мы устанавливаем сообщение фиксации и автора. Это зарегистрирует фиксацию для пользователя GitHub Action, а не для пользователя, который настроил задание.
- name: Push
id: push
if: ${{ steps.update.outputs.updated == 'true' }}
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
commit_user_name: github-actions[bot]
commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
commit_message: Automated Dependency Updates
Теперь давайте объединим все шаги в один простой Gist для использования в любом другом репозитории. Надеюсь, это поможет вам автоматизировать и эту скучную задачу. Это может работать с любым другим инструментом CI / CD, который позволяет выполнять запланированные задания. Принципы те же, просто следуйте процессам оформления заказа, обновления, тестирования и отправки.
name: Automated Dependency Updates
on:
schedule:
- cron: '0 0 * * 0'
jobs:
dependencies:
name: Update Dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.AUTOMATED_DEPENDENCY_UPDATES_TOKEN }}
- name: Setup
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Tools
id: tools
run: dotnet tool install --global dotnet-outdated-tool
- name: Update
id: update
run: |
OUTPUT=$(dotnet outdated)
if [[ $OUTPUT =~ "No outdated dependencies were detected" ]]; then
echo "::set-output name=updated::false"
else
dotnet outdated -u
echo "::set-output name=updated::true"
fi
shell: bash
- name: Test
id: test
if: ${{ steps.update.outputs.updated == 'true' }}
run: dotnet test -c Release -v minimal
- name: Push
id: push
if: ${{ steps.update.outputs.updated == 'true' }}
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
commit_user_name: github-actions[bot]
commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
commit_message: Automated Dependency Updates