CI/CD Dengan Github Actions

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
			
			

Mau Komen?