Diversity w polskim IT
Danilo Assis
Danilo AssisTechnical Lead @ Woovi

Jak automatycznie aktualizować zależności pakietów w repozytorium

Sprawdź jak zaimplementować dependabot, aby automatycznie aktualizował zależności, otwierał pr z aktualizacją dep, uruchamiał testy wewnątrz pull requesta i wykonywał automatyczne scalanie, jeśli jest to możliwe.
18.07.20224 min
Jak automatycznie aktualizować zależności pakietów w repozytorium

Praca programisty zwykle kojarzy się z hollywoodzkimi filmami, w których inteligentny człowiek lub haker pisze na klawiaturze, a na ekranie widzimy różne kody w zielonych kolorach. Albo czarne pokoje, gdzie światło monitora to jedyne, co możesz zobaczyć.

Codzienne zadania programisty

Jednak praca programisty to praca jak każda inna. Będzie borykał się z codziennymi problemami, które będzie musiał rozwiązywać, z codziennymi zadaniami, które będzie musiał zrozumieć i zastanawiać się, jaki jest najlepszy sposób na ich rozwiązanie. I jak każda inna praca, tak i ta będzie miała swoje codzienne zadania, które zabiorą nam czas w ciągu dnia.

Codzienną rutynę programisty można porównać do posiadania restauracji. Każdego dnia, kiedy przychodzisz do swojej restauracji, musisz: otworzyć okna, włączyć światła, umyć podłogę, umyć kilka naczyń, zdjąć ze stołów krzesła, cokolwiek, tak jak powiedziałem: czyli codzienne zadania.

Aktualizacja zależności moich pakietów jest jednym z tych codziennych zadań. A kiedy projekt zaczyna się rozrastać, coraz trudniej jest to robić na bieżąco.

Automatyzacja

Pracując z akcjami GitHuba, zadania są o wiele łatwiejsze do wyabstrahowania i aby tak zrobić z tym zadaniem, wykonajmy następujące rzeczy:

  • Konfiguracja dependabot, która będzie otwierać codziennie nowy pull request aktualizujący określoną zależność,
  • Akcja GitHuba odpowiedzialna za uruchomienie testów z aplikacji wewnątrz tego otwartego pull requesta,
  • Akcja Githuba odpowiedzialna za połączenie tego pull requesta, jeśli testy wewnątrz pull requesta zakończą się sukcesem.

Te przepływy działają razem, dlatego ważne jest, aby pisać testy, dzięki którym dependabot będzie działał codziennie, a testy te będą odpowiedzialne za wykrywanie problemów z aktualizacjami.


Konfiguracja dependabot

Dodajmy konfigurację do codziennego uruchamiania dependabot szukającego aktualizacji z zależności wewnątrz aplikacji.

  • w swoim projekcie na samym początku prawdopodobnie pojawi się folder o nazwie .github. Jeśli nie, utwórz go samodzielnie,
  • utwórz w nim nowy plik i nazwij jako dependabot.yml,
  • zamieść poniższy kod.

version: 2
updates:
  - package-ecosystem: npm
    directory: '/'
    schedule:
      interval: daily
      time: '01:00'
    open-pull-requests-limit: 10


Ten plik yml ustawi konfigurację dla dependabot:

  • Codziennie tworzy pull request,
  • Z przedziałem czasowym 01:00,
  • Maksymalny limit to 100,
  • Każdy pull request z dependabot utworzy nowe powiadomienie dla właściciela repozytorium.


Folder workflow

Przed utworzeniem akcji GitHuba należy utworzyć folder przepływu pracy, jeśli jeszcze nie istnieje.

  • w folderze .github utwórz nowy folder i nazwij go jako workflows


Przetestujmy akcje GitHuba

Ważne: ten przepływ jest odpowiedzialny za uruchomienie testów twojej aplikacji. Można więc oczekiwać, że środowisko testowe jest już skonfigurowane, a jeśli jeszcze go nie posiadasz, to jest to dobry moment, aby zacząć pisać testy.

Stwórzmy akcję GitHuba odpowiedzialną za uruchamianie wszystkich testów z repozytorium wewnątrz każdego otwartego pull requesta.

  • wewnątrz folderu workflow utwórz nowy plik i nazwij go test.yml,
  • zamieść poniższy kod.

name: tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "14"
      - run: yarn
      - run: yarn jest


Plik yml ustawi nową akcję odpowiedzialną za:

  • Uruchomienie wszystkich testów wewnątrz każdego pull requesta i scalenie na głównej gałęzi.
  • Uruchomi polecenie yarn, aby zainstalować wszystkie zależności.
  • Następnie uruchomimy test yarn, aby uruchomić wszystkie testy.


Dependabot i akcja GitHuba auto-merge

Utwórzmy akcję GitHuba odpowiedzialną za automatyczne łączenie pull requestów otwieranych przez dependabot. Gdy wszystkie testy będą zielone, akcja ta połączy automatycznie.

  • utwórz nowy plik wewnątrz folderu workflow i nazwij go auto-merge.yml,
  • zamieść poniższy kod.

name: auto-merge

on:
  pull_request_target:
    branches:
      - main

jobs:
  auto-merge:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - uses: ahmadnassri/[email protected]
        with:
          github-token: ${{ secrets.AUTOMERGE_TOKEN }}
          command: 'squash and merge'
          target: minor


Plik yml ustawi nową akcję odpowiedzialną za:

  • Kiedy aktorem pull requesta będzie dependabot[bot].
  • Wykorzysta on ahmadnassri/[email protected].
  • Uruchomi 'squash and merge' jeśli testy z pull requesta są zielone.
  • Tylko dla pull requestów aktualizujących zależności w wersji minor.
  • Nie tracisz czasu na przeglądanie powiadomień o zależnościach pakietów.

Folder .github powinien wyglądać w ten sposób:

github folder print


Zaktualizuj te zmiany wewnątrz nowego pull requesta i zobacz jak dzieje się magia.

A print from the pull request list page on github

pull request detail github page print

Witamy w automatyzacji

Teraz Twoja aplikacja ma już nową automatyzację, która ułatwi Ci wykonywanie codziennych zadań, a czas, który musisz poświęcić na ich ręczne wykonywanie, możesz zacząć inwestować w nowe rzeczy w swojej aplikacji.


Dlaczego automatyzacja

Jeśli chcesz spędzać mniej czasu na pisaniu testów, musisz napisać więcej testów. Powinieneś również codziennie aktualizować zależności swojej aplikacji, w przeciwnym razie będziesz miał do czynienia z przestarzałą aplikacją szybciej, niż myślisz.

Oryginalna anglojęzyczna wersja tekstu jest dostępna w portalu dev.to.

<p>Loading...</p>