GitHub Actions czyli młodszy kuzyn Bitbucket Pipelines post

Pięć lat temu popełniłem wpis, w którym opisałem Bitbucket Pipelines. Pamiętam mój zachwyt dla tej alternatywy dla Jenkinsa. Testował też inne narzędzia CI/CD, ale brak własnej infrastruktury dla CI z użyciem Bitbucketa to był killer feature.

Dzisiaj, 5 lat po tamtym wpisie pozostał tylko kurz. A ja cały Build & Release pipeline przeniosłem do GitHub Actions.

GitHub Actions

GitHub Actions to usługa, która pozwala na uruchamianie zadań w chmurze. Zadania te są oparte o Dockera, więc można je uruchamiać na dowolnym systemie operacyjnym. GitHub Actions jest darmowy dla publicznych repozytoriów. Dla prywatnych repozytoriów jest darmowy do 2000 minut miesięcznie.

Migracja z Bitbucket Pipelines

Cały process, po wielu latach bytowania z dockerem, linuxem, bashem był stosunkowo prosty. Wystarczyło przepisać pipeline z Bitbucket Pipelines na GitHub Actions. Oczywiście testując i dostosowując przy tym obrazy dockerowe oraz ich wersje.

GitHub Actions Pipeline - overview

Zerknijmy na kod

Początkowo planowałem podzielić cały pipeline na małe joby i je omawiać linia po linii. Ale w końcu zdecydowałem się na całość. Wystarczy, że zerkniesz na poniższy kawałek kodu.

name: GitHub CI

on:
    push:
        branches:
            - master

jobs:
    website:
        name: Building website
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - name: Get composer cache directory
              id: composer-cache
              run: echo "::set-output name=dir::$(composer config cache-files-dir)"
            - name: Cache dependencies
              uses: actions/cache@v1
              with:
                  path: ${{ steps.composer-cache.outputs.dir }}
                  key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
                  restore-keys: ${{ runner.os }}-composer-
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 7.4
                  coverage: none
                  extensions: mbstring, imap, intl
                  tools: composer:v1
            - name: Install dependecies through composer
              run: |
                  composer install
                  vendor/bin/sculpin generate --env=prod --url "https://michal.kruczek.it"
            - name: Archiving website
              uses: actions/upload-artifact@v1
              with:
                  name: website
                  path: output_prod/
    cv:
        name: Generating CV
        runs-on: ubuntu-latest
        container: ablu/ubuntu-texlive-full:latest
        needs: website
        steps:
            - uses: actions/checkout@v2
            - name: Generating PDF
              run: |
                  cd cv
                  make clean examples
            - name: Archiving CV
              uses: actions/upload-artifact@v1
              with:
                  name: cv
                  path: cv/cv.pdf
    upload:
        name: Releasing
        runs-on: ubuntu-latest
        needs: cv
        steps:
            - name: Download website
              uses: actions/download-artifact@v1
              with:
                  name: website
            - name: Download cv
              uses: actions/download-artifact@v1
              with:
                  name: cv
            - name: Install SSH key
              uses: shimataro/ssh-key-action@v2
              with:
                  key: ${{ secrets.SSH_KEY }}
                  name: id_rsa # optional
                  known_hosts: ${{ secrets.KNOWN_HOSTS }}
                  config: ${{ secrets.CONFIG }} # ssh_config; optional

            - name: Uploading the app
              env:
                  PUBLISH_DIRECTORY: ${{ secrets.DOCUMENT_ROOT }}
              run: |
                  rsync -acvzh website/ $PUBLISH_DIRECTORY
                  rsync -acvzh cv/ $PUBLISH_DIRECTORY

            - name: Purging cache
              env:
                  CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }}
              run: |
                  curl -X DELETE \
                  -H "Content-Type: application/json" \
                  -H "Authorization: Bearer ${CLOUDFLARE_TOKEN}" \
                  https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ID}/purge_cache \
                  --data '{"purge_everything":true}'

Linki

Kategorie: notes, tools

Tagi: ci, cd, continuousintegration, continuousdeployment, GitHub, github