CI/CD Dengan Github Actions

CICDGITHUBGITHUB ACTIONSDELIVERY

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

Github Actions

Dukungan Automasi Untuk Bahasa Pemrograman

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.

Github Actions

Deploymen Target di Github Actions

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, jobs adalah pekerjaan yang harus dilakukan pada suatu environment tertentu atauruns-on, pada contoh diatas pekerjaan dilaksanakan pada OS Ubuntu versi terbaru (secara default jobs berjalan secara paralel).

Kunci penting pada konfigurasi diatas adalah steps 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.

Registry Access Token

Token Akses di Registry npm

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

Registry Access Token

Token Akses tipe Automation

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 Access Token

Setup Token di Github

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! 🐱‍🏍