$30 off During Our Annual Pro Sale. View Details »

Building GitHub Actions in PHP with Minicli

Building GitHub Actions in PHP with Minicli

In this talk for Laracon EU 2022, I walk through what GitHub Actions are and how you can create your own Actions using Minicli, a microframework for the command line in PHP.

Erika Heidi

April 26, 2022
Tweet

More Decks by Erika Heidi

Other Decks in Programming

Transcript

  1. Erika Heidi @ Laracon EU 2022

    View Slide

  2. 1. Github Actions in a Nutshell

    View Slide

  3. GitHub Actions Overview
    ● Feature that allows GitHub users to create
    automated pipelines that can be triggered by
    events or run on schedule
    ● Popular for CI/CD
    ● Open source repos get unlimited action runs for
    free
    ● The GitHub Marketplace has a large collection of
    ready-to-use Actions contributed by the
    community

    View Slide

  4. GitHub Actions Overview
    ● Common use cases: run tests and code
    quality checks on merge / PR etc
    ● Less common use cases: something like
    Dynacover

    View Slide

  5. The GitHub Actions Ecosystem
    ● Actions
    ● Workflows
    ● Triggers
    ● Action Secrets

    View Slide

  6. Actions
    ● Self-contained units of execution that can be
    combined in workflows
    ● Actions live in dedicated repositories with an
    action.yml file that defines its configuration
    ● You can combine actions from the
    marketplace with your own custom actions
    ● Actions must be packaged as Docker images

    View Slide

  7. Workflows
    ● A configurable process that runs one or more
    jobs
    ● Each job can have multiple steps
    ● Steps can be either an Action or a shell script
    ● Steps run in order and share data
    ● Jobs run in parallel unless otherwise specified
    ● Defined in a YAML file committed to the
    repository
    ● You can have several different workflows in the
    same repository

    View Slide

  8. Workflow Example: PHP Composer
    name: PHP Composer
    on:
    push:
    branches: [ main ]
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install dependencies
    run: composer install --prefer-dist --no-progress
    - name: Run test suite
    run: composer test

    View Slide

  9. Triggers
    ● Workflows can be triggered by events such as
    new commits, new issues, when a PR is
    created, etc
    ● Workflows can also run on schedule, similar to
    cron jobs
    ● When on schedule, the minimal interval is five
    minutes

    View Slide

  10. Action Secrets
    ● Encrypted environment variables
    accessible only by GitHub Actions
    ● Can be set at repository level or per
    environment
    ● Ideal for storing API keys and auth
    tokens

    View Slide

  11. 2. Minicli Overview &
    The Demo App

    View Slide

  12. Minicli Overview
    ● Microframework for CLI PHP apps
    ● Simple command architecture
    ● Commands defined as callback (single-file
    app) or controllers (structured app)
    ● Dependency-free (except for tests)
    ● Ideal for small cron jobs, bots, simple
    workers

    View Slide

  13. View Slide

  14. The Demo app

    View Slide

  15. 3. Turning a Minicli app into a
    GitHub Action

    View Slide

  16. Preparation
    ● What will trigger this action?
    ● Do I need to combine this action with others?
    ● Do I need to use repository secrets or environment variables to configure my
    action?
    ● If my action creates output that needs to be persisted, where this content goes?

    View Slide

  17. Packaging Minicli with Docker
    FROM php:8.1-cli
    RUN apt-get update && apt-get install -y git curl libxml2-dev zip unzip
    RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
    RUN mkdir /application
    COPY . /application/
    RUN cd /application && composer install
    ENTRYPOINT [ "php", "/application/minicli" ]
    CMD ["import", "dev"]

    View Slide

  18. The action.yml file
    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'

    View Slide

  19. Tagging your action
    git add .
    git commit -m "My first action is ready"
    git tag -a -m "My first action release" v1
    git push --follow-tags

    View Slide

  20. Creating a Workflow
    name: Import posts from DEV
    on:
    schedule:
    - cron: "0 1 * * *"
    workflow_dispatch
    :
    jobs:
    main:
    runs-on: ubuntu-latest
    steps:
    (...)

    View Slide

  21. Creating a Workflow: 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 }}

    View Slide

  22. Complete workflow for reference

    View Slide

  23. Testing the workflow

    View Slide

  24. View Slide

  25. References / Useful Links
    ● ImportDevTo Action Repository
    ○ https://github.com/erikaheidi/importDevTo
    ● How to Create a GitHub Action to Import Posts from DEV to a Repository you Own (tutorial)
    ○ https://bit.ly/38nANwc
    ● GitHub Actions documentation
    ○ https://docs.github.com/en/actions
    ● Minicli documentation
    ○ https://docs.minicli.dev
    ● Other actions built with Minicli
    ○ Dynacover: https://github.com/erikaheidi/dynacover-actions
    ○ Update CONTRIBUTORS: https://github.com/minicli/action-contributors

    View Slide

  26. Thank You!
    @erikaheidi

    View Slide