CI/CD Dengan Github Actions
CI/CD
Continuous integration (CI) dan continuous delivery (CD) adalah kumpulan praktis teknik-teknik yang membantu suatu tim dalam mempercepat pengembangan dan pengiriman perangkat lunak, implementasinya sering disebut dengan CI/CD Pipeline.
Secara historis CI/CD adalah ranah bagian tim devops tetapi dengan seiring berjalannya waktu dan semakin terintegrasinya teknologi sistem pengembangan perangkat lunak maka setup CI/CD bukan hanya urusan devops. Jaman sekarang programer yang sehari-harinya memakai platform seperti Github akan sangat dengan mudah men-setup pipeline CI/CD melalui fitur yang bernama Github Actions.
Github Actions
Proses test, build & deploy yang dilakukan programer menjadi sangat mudah dengan bantuan fitur Github Actions apalagi untuk repositori projek yang bersifat publik atau open-source, fitur ini tidaklah berbayar.
Github Action tidak berbayar kecuali anda melebihi batas pemakaian maksimal seperti memakai proses action melebihi 2000 menit/bulan atau memakai penyimpanan paket di Github Package Registry melebihi 500MB.
Ada banyak template atau istilahnya pre-defined alur kerja yang disediakan secara resmi oleh Github Actions dan mendukung sangat banyak bahasa pemrograman.
kamu mau menge-test dan membangun proyek Android pake Gradle? — Sangat Bisa

tidak hanya itu, tentu saja anda bisa membuat alur kerja secara kustom yang ditulis dalam konfigurasi dengan aturan YAML dan untuk deployment-pun, Github Actions secara resmi menyediakan berbagai target terutama untuk deployment yang terkontainerisasi.

Events
Pada dasarnya Github Actions bekerja atau di- trigger berdasarkan event yang terjadi pada repositori dimana kamu men-setup Github Actions tersebut.
Event yang didukung amat sangat banyak mulai dari yang sederhana seperti event push
kode ke repositori pada branch main
, event pada saat me- release dan men- tag kode atau pada saat ada pull request, dll.
Automasi Node.js
Proses automasi test sangat diperlukan sebelum kode di publikasikan atau misalnya jika ada pull request yang masuk sehingga diperlukan test terlebih dahulu supaya diketahui terjadi konflik apa tidak dengan kode dasar.
Saya ambil contoh proyek open-source JavaScript library Pustaka Kalender Jawa. Silahkan melihat kode sumber dari repositori tersebut, konfigurasi Github Actions ada pada folder .github/workflows
.
Pada proyek tersebut ada 3 automasi yang memakai Github Actions:
Node.js Test & Build
Alur kerja ini bertugas untuk mengautomasi proses pengetestan dan build library.
node.js.yml
name: Node.js Test & Build
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x, 14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm run build --if-present
- run: npm test
on
adalah trigger dimana action akan dijalankan, adalah pekerjaan yang harus dilakukan pada suatu environment
tertentu atau runs-on
, pada contoh diatas pekerjaan dilaksanakan pada OS Ubuntu versi terbaru (secara default jobs
berjalan secara paralel).
Kunci penting pada konfigurasi diatas adalah yaitu task-task atau tugas-tugas yang harus dilakukan secara sekuensial atau berurutan didalam suatu job. Tugas yang harus dilakukan bisa memakai action dari suatu repositori seperti action/checkout@v2
yang fungsinya men- checkout kode sebelum proses build dan testing kemudian ada action/setup-node@v1
yang tugasnya untuk menge-set versi Node.js yang akan digunakan sesuai dengan settingan key pada strategy.matrix
.
Langkah penting berikutnya adalah build dan testing seperti saat kamu men-eksekusi npm run build
dan npm run test
.
Publish npm
Alur kerja ini bertugas untuk automasi publishing paket ke registry npm dan ke registry paket Github.
npm-publish.yml
name: Publish npm
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
- run: npm ci
- run: npm test
publish-npm:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
registry-url: https://registry.npmjs.org/
- run: npm ci
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
publish-gpr:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
registry-url: https://npm.pkg.github.com/
- run: npm ci
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
Pada alur kerja * Publish npm ada 3 pekerjaan yang harus dilakukan yaitu build
yang inti tugasnya hanyalah testing npm run test
, publish-npm
adalah mepublikasikan paket ke npm Registry & publish-gpr
adalah pekerjaan untuk mempublikasikan paket ke Github Package Registry.
NPM_TOKEN
Setup penting di alur kerja ini adalah harus menge-set token NPM_TOKEN
yang bisa didapat dari menu Access Token di registry npm.

Pastikan memilih token yang bertipe automation supaya pada saat proses automasi tidak akan meminta autentikasi 2 langkanh ( two-factor authentication).

dan token ini harus di set di proyek dimana automasi akan dilakukan. Anda bebas menentukan nama dari token hanya saja pastikan nama itu sama dengan pengaturan di konfigurasi automasi.

GITHUB_TOKEN
Token untuk publishing npm ke Github Package Registry akan secara otomatis diambil dari platform Github sehingga tidak perlu ada pengaturan tambahan, hanya saja pastikan jangan merubah nama token di konfigurasi automasi.
Automasi jenis ini sangatlah membantu dalama publish npm alih-alih melakukan publishing manual melalui command line, sangat menghemat waktu.
Docker Testing
Alur kerja ini bertugas untuk automasi testing node.js.
Pada repositori Kalender Jawa hasil build library ada yang mendukung ES Module dan ada yang tidak sehingga diperlukan pengetestan di berbagai macam versi Node.js
docker-test.yml
name: Docker Testing
on:
push:
# Publish `master` as Docker `latest` image.
branches:
- master
# Publish `v1.2.3` tags as releases.
tags:
- v*
# Run tests for any PRs.
pull_request:
env:
# TODO: Change variable to your image's name.
IMAGE_NAME: pustaka-docker-test
jobs:
# Run tests.
# See also https://docs.docker.com/docker-hub/builds/automated-testing/
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run tests
run: docker build . --file Dockerfile
Inti dari automasi docker pada konfigurasi diatas adalah eksekusi perintah berikut
docker build . --file Dockerfile
yang akan membangun docker image berdasarkan file
Dockerfile
#https://hub.docker.com/_/node?tab=tags&page=1&name=12.16
FROM node:12.16.3-stretch-slim
# copy cjs library version to app dir
COPY ./lib/kalenderjawa.min.cjs /app/kalenderjawa.min.cjs
# copy test file index.js to app dir
COPY ./examples/index.js /app/index.js
WORKDIR /app
# run
RUN node index.js
Sekian, Happy Hacking! 🐱🏍