An Interest In:
Web News this Week
- March 22, 2024
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
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:
actions/checkout@v2
erikaheidi/[email protected]
eter-evans/create-pull-request@v3
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).
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
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To