GitHub 작업 및 PHP를 사용하여 동적 GitHub 프로필을 빌드하는 방법

2020년 여름, GitHub는 커뮤니티에서 빠르게 인지한 기능인 프로필 README를 조용히 출시했습니다. Aprofile README는 GitHub 프로필의 글로벌README 파일로, GitHub 사용자 이름과 이름이 동일한 공개 리포지토리를 생성하여 설정할 수 있습니다. 예를 들어 내 사용자 이름이 osteel 이므로 osteel/osteel repository 을 만들었습니다.

자신의 것을 추가하는 동안 다음과 같은 작은 상자가 나타납니다.



리포지토리가 생성되면 자신이 얼마나 훌륭한지 설명하는 간단한 설명과 함께 README 파일을 추가하세요. 그러면 GitHub 프로필 페이지에 기본적으로 콘텐츠가 표시됩니다.



깔끔하고 심플합니다.

영감을 얻기 위해 browsing examples, 최근 작업 및 블로그 출판물과 같은 동적 콘텐츠를 특징으로 하는 Simon Willison의 version을 우연히 발견했습니다. 그는 GitHub Actions과 Python의 조합을 사용하여 이것을 blog post에서 어떻게 달성했는지 설명했고 나는 PHP로 비슷한 작업을 하기로 결정했습니다.

자리 표시자



가장 먼저 할 일은 동적 콘텐츠가 들어갈 README 파일에 자리 표시자를 만드는 것입니다. 내 블로그의 최신 출판물을 자동으로 삽입하고 싶었기 때문에 다음 태그를 사용했습니다.

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


이 형식을 알 수 있습니다. Markdown 파일은 HTML도 지원하므로 일부 HTML 주석 태그를 사용하여 내 프로필 페이지에 표시되지 않도록 했습니다.

PHP 스크립트



프레임워크 없이 PHP를 마지막으로 작성한 것이 언제인지 기억나지 않습니다. 결과적으로 기본 PHP 스크립트와 일부 Composer 종속성을 시작하기 위해 quick search 작업을 수행해야 했습니다.

아주 간단합니다! 첫 번째 단계는 다음 명령을 사용하여 프로젝트를 초기화하는 것입니다.

$ composer init


거기에서 내 블로그a lightweight library를 구문 분석하기 위해 RSS feed을 설치했습니다.

$ 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의 자동 로드가 필요하므로 RSS 파서를 로드하여 블로그 게시물 목록을 Markdown 형식의 문자열로 생성할 수 있습니다.

그런 다음 README 파일의 기존 내용이 $content 변수에 로드되고 Markdown 문자열이 <!-- posts --> 가 있는 <!-- /posts -->preg_replace 태그 사이에 삽입됩니다.

마지막으로 file_put_contents 함수를 사용하여 파일의 전체 내용을 새 내용으로 대체합니다.

워크플로



GitHub Actions 개발자는 테스트 제품군 실행 또는 웹 서비스 배포와 같은 다양한 작업을 자동화하는 워크플로를 작성할 수 있습니다.

프로젝트 루트의 .github/workflows 폴더에서 YAML 형식을 사용하여 정의해야 하며 실행할 단계 목록을 포함해야 합니다.

여기 내 이름이 있습니다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: '8.1'
    - 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 이미지에서 실행되어야 함을 나타냅니다. 여기서 다음을 수행합니다.

  • clone the repository ;

  • instal PHP 8.1 ;
  • Composer 종속성을 설치합니다.
  • PHP 스크립트를 실행합니다.

  • commit and push the changes (있는 경우).

  • 그게 다야! 내 GitHub 프로필은 이제 새 기사를 게시할 때마다 자동으로 업데이트됩니다.

    결론



    이것은 앞으로 더 많이 사용할 것으로 예상되는 GitHub Actions를 탐색하는 것을 목표로 하는 빠른 실험이었습니다. 또한 PHP를 절차적인 방식으로 간단한 스크립팅 언어로 다시 사용하는 것도 재미있었습니다.

    이 기사를 짧고 간단하게 유지하기 위해 자발적으로 몇 가지를 생략했습니다. 구현 세부사항은 the repository을 참조하십시오.

    자원


  • Managing your profile README
  • GitHub Actions
  • This article’s repository
  • GitHub Action: Checkout V2
  • GitHub Action: Setup PHP
  • GitHub Action: Git Auto Commit
  • 좋은 웹페이지 즐겨찾기