Как стать автором
Обновить
761.31
OTUS
Цифровые навыки от ведущих экспертов

Как создать динамический профиль на GitHub с помощью GitHub Actions и PHP

Время на прочтение4 мин
Количество просмотров4.7K
Автор оригинала: Yannick Chenot

В прошлом году GitHub без лишнего шума выпустил новую возможность, которую быстро заметили в сообществе пользователей, — файлы README в профилях. По сути, README-файл профиля представляет собой глобальный файл README, связанный с вашим профилем GitHub. Чтобы он появился, нужно создать публичный репозиторий, имя которого совпадает с вашим именем пользователя на GitHub. Например, мое имя пользователя — osteel, поэтому я создал osteel/osteel в качестве такого репозитория.

При добавлении такого репозитория в своем аккаунте вы увидите табличку, подобную этой:

Создав репозиторий, поместите туда файл README и добавьте в него краткую автобиографию с перечислением всех своих достоинств. Тогда страница вашего профиля на GitHub будет по умолчанию отображать содержимое этого файла:

Изящно и просто.

Просматривая примеры в поисках вдохновения, я наткнулся на версию от Саймона Уиллисона (Simon Willison) с динамической загрузкой контента, такого как список недавних работ и публикаций из блога. В своей статье автор поясняет, что для достижения цели он использовал GitHub Actions в связке с Python, а я решил сделать что-то подобное на PHP.

Местозаполнитель

Сперва нужно создать местозаполнитель в файле README — на его месте будет размещаться динамический контент. Мне хотелось автоматически вставлять последние публикации из своего блога, поэтому я использовал следующие теги:

<!-- posts --><!-- /posts -->

Возможно, вам знаком этот формат. Поскольку файлы формата Markdown поддерживают HTML, я использовал HTML-теги комментариев, зная, что они не будут отображаться на странице моего профиля.

Скрипт на PHP

Уже не помню, когда в последний раз писал на PHP без фреймворка, поэтому для создания базового PHP-скрипта мне сначала пришлось найти в сети краткую статью, в которой даны инструкции по работе с зависимостями через менеджер пакетов Composer.

Оказывается, это довольно просто! Первым шагом я инициализировал проект с помощью следующей команды:

$ composer init

Далее я установил легковесную библиотеку для парсинга RSS-ленты моего блога:

$ composer require dg/rss-php

Затем я добавил файл posts.php в корневую папку проекта и написал в нем следующий код:

<?php

// Load Composer's autoload
require_once __DIR__ . '/vendor/autoload.php';

// Load the RSS feed
$feed = Feed::loadRss('https://tech.osteel.me/feeds/rss.xml')->toArray();

// Generate the list of blog posts
$posts = '';
foreach (array_slice($feed['item'], 0, 5) as $post) {
    $date   = date('d/m/Y', strtotime($post['pubDate']));
    $posts .= sprintf("\n* **[%s]** [%s](%s \"%s\")", $date, $post['title'], $post['link'], $post['title']);
}

// Generate the new content
$content = preg_replace(
    '#<!-- posts -->.*<!-- /posts -->#s',
    sprintf('<!-- posts -->%s<!-- /posts -->', $posts),
    file_get_contents('README.md')
);

// Overwrite the file
file_put_contents('README.md', $content);

Тут все относительно просто: вверху я добавляю как зависимость созданный в Composer файл автозагрузки autoload, позволяющий мне загружать RSS-парсер и генерировать список публикаций из блога в виде строки в формате Markdown.

Затем текущее содержимое файла README загружается в переменную $content, после чего Markdown-строка вставляется между тегами <!-- posts --> и <!-- /posts --> с помощью функции preg_replace.

Наконец, все содержимое файла заменяется новым при помощи функции file_put_contents.

Действие в GitHub Actions

GitHub Actions — это сравнительно новое дополнение к GitHub, позволяющее разработчикам создавать действия для автоматизации различных задач CI/CD, таких как прогон набора тестов или развертывание веб-сервисов.

Действия определяются в формате YAML и сохраняются как файлы в папке .github/workflows в корне проекта. Определение действия содержит список операций к выполнению.

Вот мой файл действия, который я назвал posts.yml:

name: Update blog posts

on:
  push:
  workflow_dispatch:
  schedule:
    - cron:  '0 0 * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Clone repository
      uses: actions/checkout@v2
    - name: Install PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '7.4'
    - name: Install Composer dependencies
      run: composer install
    - name: Insert blog posts
      run: php posts.php
    - name: Push changes
      uses: stefanzweifel/git-auto-commit-action@v4
      with:
        commit_message: Updated latest blog posts

Опять же, относительно простая структура. Сначала присваиваем действию имя, а затем определяем список событий, которые должны его инициировать: отправка какого-нибудь кода в репозиторий, запуск вручную из интерфейса (workflow_dispatch) или периодический запуск подобно cron-заданию (здесь — ежесуточно в полночь).

Затем указываем, что действие будет запускаться на образе Ubuntu и в рамках действия будут выполняться следующие операции:

Вот и все! Теперь мой профиль на GitHub автоматически обновляется каждый раз, когда я публикую новую статью.

Заключение

Этот небольшой эксперимент продвинул нас вперед в освоении возможностей GitHub Actions, которые я планирую использовать все чаще и чаще в будущем. Кроме того, было интересно снова попробовать PHP в качестве простого скриптового языка для написания кода в процедурной парадигме.

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

Статья была изначально опубликована на ресурсе tech.osteel.me.


Материал переведен в преддверии старта курса "PHP Developer. Professional".

Теги:
Хабы:
+11
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS