How to make your own CI container for github actions

Draft Disclaimer: Please note that this article is currently in draft form and may undergo revisions before final publication. The content, including information, opinions, and recommendations, is subject to change and may not represent the final version. We appreciate your understanding and patience as we work to refine and improve the quality of this article. Your feedback is valuable in shaping the final release.

How to make your own CI container for github actions

  • able to run your github actions online
  • context: needed to install more php extensions
  • avoid repetition between linting and testing workflows Lint
on: push
name: Code Style
jobs:
  php:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 7.4
          tools: pecl
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, couchbase
          coverage: none
        # By default, extensions which cannot be added or removed gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set fail-fast flag to true.
        env:
          fail-fast: true

      - name: Get Composer Cache Directory
        id: composer-cache
        run: |
          echo "::set-output name=dir::$(composer config cache-files-dir)"

      - uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-

      - name: Install Composer dependencies
        run: composer global require friendsofphp/php-cs-fixer

      - name: Check PHP CS Fixer version
        run: php-cs-fixer --version

      - name: Check Coding Standards
        run: composer lint

Test

on: push
name: Tests
jobs:
  php:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 7.4
          tools: pecl
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, couchbase
          coverage: none
        # By default, extensions which cannot be added or removed gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set fail-fast flag to true.
        env:
          fail-fast: true

      - name: Run test suites
        run: composer test
  • using a custom customer
FROM ubuntu:20.04
LABEL maintainer="Optimus Debugger <[email protected]>"
ARG DEBIAN_FRONTEND=noninteractive

ENV GOSS_VERSION="0.3.6"

RUN apt-get update && apt-get install -y software-properties-common curl
RUN add-apt-repository ppa:ondrej/php -y
RUN add-apt-repository ppa:git-core/ppa -y
RUN apt-get update -y
RUN apt-get install -y \
    unzip  \
    php7.4-cli \
    php7.4-gd \
    php7.4-json \
    php7.4-ldap \
    php7.4-mbstring \
    php7.4-mysql \
    php7.4-pgsql \
    php7.4-sqlite3 \
    php7.4-xml \
    php7.4-xsl \
    php7.4-zip \
    php7.4-curl \
    php7.4-soap \
    php7.4-gmp \
    php7.4-bcmath \
    php7.4-imagick \
    php7.4-intl \
    php7.4-redis \
    php7.4-imap \
    php7.4-phpdbg \
    php7.4-dom \
    php7.4-pdo \
    php7.4-sqlite \
    php7.4-bcmath \
    php7.4-intl \
    php7.4-soap \
    php7.4-exif \
    php7.4-iconv \
    php7.4-imagick

# composer
ENV COMPOSER_HOME=/composer
ENV PATH=./vendor/bin:/composer/vendor/bin:/root/.yarn/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# mysql client
RUN apt-get install -y mysql-client

# git
RUN apt-get install -y git

# node and yarn
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g yarn

# goss
RUN curl -fsSL https://goss.rocks/install | GOSS_VER=v${GOSS_VERSION} sh

## Install PECL
RUN apt-get install -y php-pear php7.4-dev php7.4-xml

## MongoDB
RUN pecl install mongodb-1.10.0alpha1
  • Usage become

Lint

on: push
name: Code Style
jobs:
  php:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      - name: Install system dependencies
        run: |
          sudo wget -O - https://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -
          echo "deb https://packages.couchbase.com/ubuntu bionic bionic/main" | sudo tee /etc/apt/sources.list.d/couchbase.list
          sudo apt-get update
          sudo apt-get install libcouchbase-dev

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 7.4
          tools: pecl
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, couchbase
          coverage: none
        # By default, extensions which cannot be added or removed gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set fail-fast flag to true.
        env:
          fail-fast: true

      - name: Get Composer Cache Directory
        id: composer-cache
        run: |
          echo "::set-output name=dir::$(composer config cache-files-dir)"

      - uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-

      - name: Install Composer dependencies
        run: composer global require friendsofphp/php-cs-fixer

      - name: Check PHP CS Fixer version
        run: php-cs-fixer --version

      - name: Check Coding Standards
        run: composer lint

Test

on: push
name: Tests
jobs:
  php:
    runs-on: ubuntu-latest
    container:
      image: your-org/laravel-test-runner:7.4

    steps:
      - uses: actions/checkout@v1

      - name: Run test suites
        run: composer test
  • Simpler is better
  • CI to auto publish and validate publish: .github/workflows/php-7.4-publish.yml
name: php-7.4-publish
on:
push:
branches:
- master
jobs:
publish:
runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1

    - name: Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: pfizer/canvas-test-runner
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        workdir: 7.4
        tags: "7.4"

validate: .github/workflows/php-7.4-validate.yml

on: push
name: php-7.4-validate
jobs:
  validate:
    runs-on: ubuntu-latest
    container:
      image: pfizer/canvas-test-runner:7.4

    steps:
    - uses: actions/checkout@v1
    - run: goss --gossfile 7.4/goss.yaml validate

  • goss goss.yaml
command:
  node --version:
    exit-status: 0
    stdout:
      - "v12"
  yarn --version:
    exit-status: 0
  npm --version:
    exit-status: 0
    stdout:
      - "6"
  git --version:
    exit-status: 0
  composer --version:
    exit-status: 0
  php --version:
    exit-status: 0
    stdout:
      - 7
  php -m:
    exit-status: 0
    stdout:
      - bcmath
      - calendar
      - exif
      - gd
      - iconv
      - imagick
      - imap
      - intl
      - ldap
      - mbstring
      - mysqli
      - pcntl
      - pdo_mysql
      - pdo_pgsql
      - pgsql
      - soap
      - xml
      - zip
      - mongodb
      - couchbase