Авторизоваться
Аким Солянкин 29.11.2021 Опубликована

Использование действий GitHub для автоматического обновления зависимостей .NET 

Это старая как время сказка, что, будучи инженером-программистом, вы пишете код, довольны им, а затем предоставляете его. Конец истории, правда? Больше нечего делать! Как обычно, есть еще много слоев, с которыми нужно иметь дело, и один из них - обслуживание…

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

Я бэкэнд-инженер и много пишу на C #, а это значит, что я получаю решения, основанные на пакетах NuGet. Их нужно постоянно обновлять, потому что есть другие инженеры, которые проделывают потрясающую работу по поддержанию своих пакетов в актуальном состоянии, а мне нравится поддерживать свои зависимости в актуальном состоянии. Вот где я нахожусь с проблемой создания ветки, обновления пакетов, фиксации их, а затем получения одобрения PR, просто чтобы получить некоторые незначительные обновления. Это раздражает, и я хочу это решить.

Прежде чем мы начнем, эти инструкции мне подходят?

  1. У вас есть решение, написанное на .NET ... эти инструкции работают только для кода на .NET.
  2. Код уже есть, или вы собираетесь разместить это решение в Github… так что вы можете использовать Actions.
  3. Вы хотите обновить свои пакеты NuGet, у инженеров есть веские причины делать или не делать что-то, здесь никакого давления. Мне нравится обновлять свои пакеты или, по крайней мере, предупреждать меня, когда мне нужно внести изменения из-за обновлений зависимостей.

Если вы в деле, пора поработать здесь со мной. Действия можно использовать для запуска многих рабочих процессов. Наиболее распространенными являются конвейеры сборки и выпуска для вашего проекта. Ответ на нашу проблему также находится в действии. Пришло время создать новую.

  1. Перейдите в выбранный вами репозиторий GitHub.
  2. Выберите вкладку Действия
  3. Нажмите эту кнопку "Новый рабочий процесс".
  4. Игнорируйте все шаблоны и выберите «Самостоятельно настроить рабочий процесс».
  5. Удалите весь образец кода, и все готово.

Шаг 1. Создайте действие расписания

Это самая простая часть, эта акция будет выполняться раз в неделю. Вы можете изменить расписание на все, что захотите. GitHub Action работает не вовремя, но запускается. Чтобы узнать больше о запланированных заданиях и настройке расписаний, прочтите документацию GitHub и ознакомьтесь с примерами на Crontab Guru.

name: Automated Dependency Updates
on:
    schedule:
        - cron:  '0 0 * * 0'

Шаг 2: Настройте задание

Далее мы настраиваем работу. Здесь мы определяем, какие шаги мы хотим выполнить. Мы выполняем эту работу на последней версии Ubuntu. Затем мы настраиваем шаг actions/checkout по умолчанию, а также actions/setup-dotnet для установки версии .NET SDK, необходимой для нашего решения. Для этой работы мне нужен .NET 6. Вы должны заметить измененный токен для оформления заказа AUTOMATED_DEPENDENCY_UPDATES_TOKEN, это пригодится на шаге 5, я объясню, что там внизу.

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

Шаг 3. Обновите эти зависимости

Это основные шаги обновления наших пакетов NuGet. Во-первых, нам нужно установить устаревший инструмент dotnet, а затем проверить, нужно ли нам предпринимать какие-либо дальнейшие действия. Если мы запустим dotnet outdated и нет пакетов для обновления, мы должны отменить остальные шаги в этом задании.
Это делается, но на этапе проверки устанавливается выходная переменная, которая может использоваться на всех других этапах задания, чтобы определить, следует ли его запускать или нет. Если никаких обновлений не требуется, мы устанавливаем для выходной переменной значение false.
Если у нас есть обновления для их создания, мы запускаем dotnet outdated -u для принудительного обновления NuGet. В случае успеха мы устанавливаем для выходной переменной значение 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

Шаг 4. Запустите тесты

После обновления пакетов NuGet вам необходимо убедиться, что изменения не нарушили ваш код. Лучший способ сделать это - создать и протестировать свое решение. Это простая команда dotnet test для запуска всех тестов решения. Вы можете обновить этот оператор в соответствии с вашими потребностями, по умолчанию должны выполняться все ваши тесты.

- name: Test
  id: test
  if: ${{ steps.update.outputs.updated == 'true' }}
  run: dotnet test -c Release -v minimal

Шаг 5: Зафиксируйте и нажмите

Последним шагом является фиксация, а затем отправка обновлений пакета 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

Источник

Forem logo
Коментарии
Авторизоваться что-бы оставить комментарий
Присоединяйся в тусовку
Наш сайт использует файлы cookie для вашего максимального удобства. Пользуясь сайтом, вы даете свое согласие с условиями пользования cookie