Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 22, 2022 04:30 pm GMT

Como criar uma GitHub Action para importar posts do DEV.to em PHP com o Minicli - Vdeo Tutorial

GitHub Actions uma funcionalidade oferecida pelo GitHub que permite a execuo de processos automatizados que podem ser engatilhados por eventos tais como pull requests, pushs, novos comentrios, mas tambm podem rodar em agendamento similar ao crontab. Actions podem ser combinadas para a criao de workflows automatizados diversos, que podem ser usados para CI/CD e tambm para outras finalidades.

Repositrios open source tem acesso ilimitado a esse recurso, fazendo dessa funcionalidade uma tima ferramenta para execuo de tarefas agendadas, pequenos workers e bots.

Esse post rene os vdeos que produzi mostrando como criar uma GitHub Action em PHP com o Minicli, um microframework PHP para a linha de comando. O primeiro vdeo traz uma introduo rpida sobre o Minicli, til para fornecer um contexto antes de iniciarmos o desenvolvimento da aplicao. No segundo vdeo, vemos como criar a aplicao que ir importar os posts do DEV.to e salv-los como arquivos markdown. No terceiro e ltimo vdeo, vemos como adaptar a aplicao para ser usada como GitHub Action.

Logo abaixo dos vdeos voc encontra os comandos e arquivos necessrios para reproduzir o tutorial.

Prerequisitos para seguir o tutorial

Para executar os passos desse tutorial, voc precisar de:

  • Um ambiente de desenvolvimento PHP-cli 8.0+, com a extenso php-curl instalada.
  • Composer instalado.

Introduo ao Minicli (Opcional)

Nesse vdeo curto, mostro uma viso geral sobre o Minicli e como fazer o bootstrap de uma nova aplicao usando esse framework.

Criando uma aplicao Minicli para importar posts do DEV.to

Nesse vdeo, criamos uma aplicao Minicli do zero e desenvolvemos um comando para importar posts de um usurio ou org do DEV.to, usando a API fornecida por essa plataforma de contedo.

Bootstrap da aplicao

Voc pode criar uma nova aplicao Minicli com o seguinte comando:

composer create-project minicli/application importDevTo

Adicionando dependncia minicli/curly

Vamos usar o pacote minicli/curly para fazer requisies API do DEV.to:

composer require minicli/curly

Criando um novo comando

Para criar um novo comando que ser chamado com minicli import dev, voc precisar seguir a conveno estabelecida pelo Minicli: app/Command/CommandNamespace/SubcommandController.php.

mkdir app/Command/Importtouch app/Command/Import/DevController.php

Vamos precisar de alguns valores de configuraes que podero ser usados para customizar essa Action atravs de variveis de ambiente. Abaixo, a verso mais atualizada do arquivo, j contendo alteraes que sero trazidas no prximo vdeo:

<?phpreturn [    'app_path' => __DIR__ . '/app/Command',    'debug' => true,    'devto_username' => getenv('DEVTO_USERNAME') ?: 'erikaheidi',    'data_path' => getenv('APP_DATA_DIR') ?: __DIR__ . '/devto'];

Para usar esse config com a aplicao, voc precisar editar o arquivo minicli na raiz da aplicao. Substitua a linha onde a aplicao instanciada pela seguinte linha:

(...)$app = new App(require __DIR__ .'/config.php');(...)

A verso mais atualizada do arquivo DevController.php, que contm o comando chamado por minicli import dev, est disponvel abaixo. Note que essa verso no ir coincidir com a do vdeo pois contm algumas adaptaes includas posteriormente para facilitar o uso prtico dessa aplicao como GitHub Action.

<?phpnamespace App\Command\Import;use Minicli\Curly\Client;use Minicli\Command\CommandController;class DevController extends CommandController{    public string $API_URL = 'https://dev.to/api';    public function handle(): void    {        $this->getPrinter()->display('Fetching posts from DEV...');        $crawler = new Client();        if (!$this->getApp()->config->devto_username) {            throw new \Exception('You must set up your devto_username config.');        }        $devto_username = $this->getApp()->config->devto_username;        $articles_response = $crawler->get($this->API_URL . '/articles?username=' . $devto_username);        if ($articles_response['code'] !== 200) {            throw new \Exception('Error while contacting the dev.to API.');        }        if (!$this->getApp()->config->data_path) {            throw new \Exception('You must define your data_path config value.');        }        $data_path = $this->getApp()->config->data_path;        if (!is_dir($data_path) && !mkdir($data_path)) {            throw new \Exception('You must define your data_path config value.');        }        $articles = json_decode($articles_response['body'], true);        foreach($articles as $article) {            $get_article = $crawler->get($this->API_URL . '/articles/' . $article['id']);            if ($get_article['code'] !== 200) {                $this->getPrinter()->error('Error while contacting the dev.to API.');                continue;            }            $article_content = json_decode($get_article['body'], true);            $date = new \DateTime($article_content['published_at']);            $filepath = $data_path . '/' . $date->format('Ymd') . '_' . $article_content['slug'] . '.md';            $file = fopen($filepath, 'w+');            fwrite($file, $article_content['body_markdown']);            fclose($file);            $this->getPrinter()->info("Saved article: " . $article_content['title'] . " to $filepath");        }        $this->getPrinter()->info("Finished importing.", true);    }}

Convertendo a aplicao demo em GitHub Action

Nesse vdeo, partimos da aplicao desenvolvida no vdeo anterior, fazendo pequenas adaptaes e criando os arquivos necessrios para usar a aplicao como GitHub Action.

Criando um Dockerfile para a aplicao

O arquivo Dockerfile deve ser criado na raiz do repositrio da sua GitHub Action. Ele ser referenciado pelo arquivo action.yml que define o que essa Action ir executar.

FROM php:8.1-cliRUN apt-get update && apt-get install -y \    git \    curl \    libxml2-dev \    zip \    unzipRUN apt-get clean && rm -rf /var/lib/apt/lists/*# Install Composer and set up applicationCOPY --from=composer:latest /usr/bin/composer /usr/bin/composerRUN mkdir /applicationCOPY . /application/RUN cd /application && composer installENTRYPOINT [ "php", "/application/minicli" ]CMD ["import", "dev"]

Criando um action.yml

O arquivo action.yml define os metadados da Action e deve ser comitado na raiz do repositrio.

name: 'Import DEV.to posts'description: 'Imports posts from DEV.to as markdown files'outputs:  response:    description: 'Output from command'runs:  using: 'docker'  image: 'Dockerfile'

Montando um Workflow

O workflow deve ser criado no repositrio onde voc quer salvar os arquivos markdown. Esse arquivo pode ter qualquer nome desde que esteja dentro da pasta .github/workflows dentro do repositrio.

O workflow abaixo ir criar um pull request sempre que houver uma diff entre a verso atual do repositrio e o contedo importado pela Action. Ele utiliza trs actions:

name: Import posts from DEVon:  schedule:    - cron: "0 1 * * *"  workflow_dispatch:jobs:  main:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v2      - uses: erikaheidi/[email protected]        name: "Import posts from DEV"        env:          DEVTO_USERNAME: erikaheidi          APP_DATA_DIR: ${{ github.workspace }}/devto      - name: Create a PR        uses: peter-evans/create-pull-request@v3        with:          commit-message: Import posts from DEV          title: "[automated] Import posts from DEV"          token: ${{ secrets.GITHUB_TOKEN }}

Testando workflow

Para testar o workflow, acesse o repositrio e v at a aba "Actions", selecione o workflow no sidebar da esquerda, e clique em "Run Workflow".

Aps o workflow finalizar sua execuo, voc dever ver um pull request aberto no repositrio onde o workflow est definido (desde que haja posts que no foram importados j anteriormente).

pull request criado automaticamente por esse workflow

Concluso

GitHub Actions uma ferramenta poderosa e verstil oferecida pelo GitHub que nos permite executar workflows customizados que vo muito alm de CI/CD. Nesse tutorial eu procurei passar um pouco mais de contexto para enriquecer os tutoriais em vdeo que compartilhei recentemente sobre o assunto.

Links teis:


Original Link: https://dev.to/erikaheidi/como-criar-uma-github-action-para-importar-posts-do-devto-em-php-com-o-minicli-video-tutorial-2lnd

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To