Starred

#github #golang

12 октября 2020 года создал репозиторий в Github juev/awesome-stars на основе проекта maguowei/starred . Каждый день в определенное время запускается github actions, выгружает информацию о всех звездах, что проставил в Github, и формирует новый Readme.md файл на основе этой информации.

Полтора года все работало безотказно. И несколько дней назад все сломалось. При обновлении репозитория стала появляться ошибка:

Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.7.12/x64/bin/starred", line 8, in <module>
    sys.exit(starred())
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/starred/starred.py", line 72, in starred
    for s in stars:
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/github3/structs.py", line 122, in __iter__
    yield cls(i)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/github3/models.py", line 48, in __init__
    self._update_attributes(json)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/github3/repos/repo.py", line 97, in _update_attributes
    self.owner = users.ShortUser(repo["owner"], self)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/github3/models.py", line 48, in __init__
    self._update_attributes(json)
  File "/opt/hostedtoolcache/Python/3.7.12/x64/lib/python3.7/site-packages/github3/users.py", line 311, in _update_attributes
    self.avatar_url = user["avatar_url"]
TypeError: 'NoneType' object is not subscriptable
Error: Process completed with exit code 1.

Питон я не люблю, разбираться в кишках starred не стал. Завел тикет , чтобы была информация о проблеме. И затем решил реализовать starred на гошечке.

Потратил немного времени на создание juev/starred . Протестировал и опубликовал уже две версии. Вторая исправляет ошибку, возникающую при обновлении существующего репозитория.

Теперь мой juev/awesome-stars настроен и использует starred реализованный на Golang. Помимо запуска в github action, теперь есть возможность использовать starred почти из любой операционной системы, будь то windows, linux или macos. Для этого достаточно скачать бинарный дистрибутив со страницы релиза и далее задав токен, запускать в командной строке.

Для примера, собираем информацию по отмеченным репозиториям пользователя juev и создаем новый репозиторий test-repo:

$ export GITHUB_TOKEN=yourtoken
$ starred --username juev --repository test-repo --sort

Для того, чтобы проводить регулярное обновление с помощью github actions, создаем репозиторий и добавляем в него файл .github/workflows/main.yml:

name: update awesome-stars
on:
  schedule:
  - cron: 0 6 * * *
jobs:
  awesome-stars:
    name: update awesome-stars
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: robinraju/release-downloader@v1.3
      with:
        repository: "juev/starred"
        latest: true
        fileName: "*"
    - name: unpack starred
      run: tar xfz starred_*_Linux_x86_64.tar.gz
    - name: update repo
      env:
        GITHUB_TOKEN: ${{ secrets.TOKEN }}
      run: ./starred --username juev --repository awesome-stars --sort --token ${GITHUB_TOKEN} --message 'update stars'

В приведенном примере обновление настроено на 6 утра и состоит из 4 шагов:

  1. Обновляем локальный репозиторий
  2. Проводим загрузку последнего релиза starred
  3. Распаковываем архив для Linux
  4. Запускаем starred с параметрами для обновления репозитория с именем awesome-stars с сортировкой по языкам программирования для пользователя juev.

Постарался вывести всю необходимую информацию для использования starred в ридми его репозитория и во встроенной справке программы.

Теперь и у вас есть альтернатива в виде golang-версии starred.