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.
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/[email protected]
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/[email protected]
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Setup PHP
uses: shivammathur/[email protected]
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/[email protected]
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/[email protected]
- name: Generating PDF
run: |
cd cv
make clean examples
- name: Archiving CV
uses: actions/[email protected]
with:
name: cv
path: cv/cv.pdf
upload:
name: Releasing
runs-on: ubuntu-latest
needs: cv
steps:
- name: Download website
uses: actions/[email protected]
with:
name: website
- name: Download cv
uses: actions/[email protected]
with:
name: cv
- name: Install SSH key
uses: shimataro/[email protected]
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}'