สำหรับการพัฒนา application ในขั้นตอนการ deploy app ของเราเพื่อใช้ใน production หรือ ระหว่าง dev ก็ตาม วิธี classic ก็คือเราต้อง ssh เข้าไปใน server แล้ว clone code มาติดตั้งเอง ซึ่งสำหรับ dev สายรักสบายอย่างเราแล้วคงไม่อยากมาทำแบบนี้ทุกครั้งที่ update code 😂 ดังนั้นใน blog นี้เราจะมาแนะนำการทำให้ขั้นตอนการ deploy นี้ถูกทำงานโดยอัตโนมัติ โดยการใช้ CICD นั่นเองง
Tool สำหรับในการทำ CICD นั้นมีอยู่หลายตัว ตัวที่หลายๆคนน่าจะรู้จักกันก็ Jenkins
ซึ่งก็เป็น tool ที่ดี แต่สำหรับ dev อย่างเราที่ใช้ github กันเป็นประจำแล้ว (มั้งนะ🧐) เราจะไปใช้ tool ตัวอื่นทำไมในเมื่อ GitHub เองก็มี Tool ที่ช่วยทำ CICD ในตัวนั่นก็คือ GitHub Action นั่นเองง
รู้จักกับ GitHub Action
ก่อนที่จะเริ่มทำ CI/CD ด้วย Github Action ผมอยากจะให้เข้าใจการทำงานของมันก่อน
GitHub Action เป็น tool ที่ใช้ทำ continuous integration and continuous delivery (CI/CD) ทำ automate build , test , deploy ของ application ของคุณเมื่อมีการ push , pull requerst , merged code ของคุณ
โดย GitHub Action นั้นรองรับการใช้งาน selfhost (GitHub Runner) เพื่อที่จะ build , run , deploy application บน server ของคุณโดยรองรับทั้ง Linux , Windows และ macOS
สำหรับใครที่อยากไปอ่านละเอียดๆ ไปอ่านได้ที่ doc official ของ github ได้เลย
ติดต้ัง
GitHub action นั้นมีให้บริการระบบที่จะเอา workflow ของเราไป run ให้แล้วคิดค่าบริการเรา แต่ใน blog นี้จะแนะนำการใช้งานแบบ selfhost ก็คือรันทุกอย่างบน server ของเรา
การเพิ่ม runner เข้า repository หรือ organization
ในเมนู setting ที่ bar ด้านซ้ายจะมีแถบ Actions อยู่ในเลือกไปที่ Runner โดยเราจะเพิ่ม runner ของเราตรงนี้
โดยตรงนี้ให้กดที่ new self-hosted runner ได้เลย
โดยตรงส่วนนี้ให้เลือกตาม OS ที่จะใช้ได้เลย ตรง Architecture เลือกให้ตรงกับอุปกรณ์ที่ใช้ด้วย และ Github จะ gen command สำหรับ download runner ที่ตรงกับ OS ของคุณให้ด้านล่างโดยจากในรูปผมเลือกไว้เป็น linux ก็สามารถเอา command ไปรันบนเครื่องของคุณได้เลย
เมื่อโหลด runner มาบนเครื่องเราแล้ว จะต้องมีการ config runner ให้รู้จักกับ repo หรือ organization ของเราโดยตรงนี้จะมี config อยู่ใน copy มาจากหน้าติดตั้งได้เลย และเมื่อเอาไปใช้ ตรงไฟล์ workflow จะต้องระบุให้ไปรันบนเครื่องของเราด้วย
หลังจากเรารันด้วยคำสั่ง ./run.sh แล้วตัว runner จะไม่ได้รันใน background เมื่อเราปิดไปจะไม่สามารถใช้งานต่อได้ ต่อไปเราจะมาตั้งให้ runner รันอยู่ใน background เพื่อให้เมื่อเราปิด terminal ไป runner จะยัง run ต่อไปได้
sudo ./svc.sh status #ตรวจสอบสถานะ runner service
sudo ./svc.sh install #ติดตั้ง runner service
sudo ./svc.sh start #เริ่ม runner service
เมื่อตั้งตั้งเสร็จแล้ว service github runner ก็จะรันอยู่ใน background แล้ว โดยสามารถเข้าไปดูสถานะ ของ runner ได้ในหน้าที่เราใช้เพิ่ม runner ได้เลย
การใช้งาน
สำหรับการใช้งาน Github Action หลังจากที่เราติดตั้ง runner กันแล้วต่อไปเรามาทำส่วนที่จะไปสั่งงาน runner กันซึ่งเราจะต้องเขียนสิ่งที่เรียกว่า workflow มีไว้ไปสั่ง runner ว่าให้ทำอะไรบ้างเป็นลำดับๆ
โดยใน repo ของเราจะต้องมีการสร้างไฟล์ไว้ที่ path ที่กำหนด หรือสามารถสร้างจาก template ได้เลยโดยสามารถดูได้จาก Actions
เมื่อเราเลือก template github จะสร้าง ไฟล์ workflow ขึ้นมาให้เลย เราก็สามารถแก้เองได้จากในรูปตัวอย่างเป็นการ build docker
แต่ถ้าหากเราต้องการสร้างเองก็สามารถทำได้โดยใน blog นี้จะทำตัวอย่างการ build docker-compose โดยผมจะสร้างไฟล์ workflows ชื่อ compose.yml ไว้ที่ path ตามด้านล่าง โดยใน repo นี้จะมีไฟล์ docker-compose.yml ที่ root
example-github-action
├── .github
├ ├── workflows
├ └── compose.yaml
├── src
├── docker-compose.yml
├── dockerfile
โดยในไฟล์ docker-compose.yml จะมีการเขียน workflows ตามนี้
จาก workflows ด้านบนเมื่อมีการ push code ลงใน git จะ เริ่มทำงานตาม workflow โดย Action จะโหลด code ของคุณไปที่ runner และเริ่มทำงานตาม workflow คือ รันคำสั่ง docker-compose ในระหว่างการทำงานเราสามารถเข้าไปดูสถานะ หรือ log ได้ผ่าน github ได้เลย โดยเข้าไปที่เมนู Action
โดยในหน้านี้เราสามารถดูสถานะได้ว่าทำไปถึงไหนแล้วในกรณีที่เรามีหลาย step ใน workflow และในแต่ละอันเราสามารถกดเข้าไปดู log ได้ และเมื่อจบ workflows app ของเราก็จะรันอยู่ในเครื่อง runner เป็นที่เรียบร้อย เราก็ไปใช้ต่อได้เลยย
หรือถ้าใครอยากที่จะ build image แล้ว push เก็บไว้ใน GitHub Registry สามารถใช้ workflow ตามนี้ได้เลย
name: CI/CD
on:
push:
branches:
- main
jobs:
build:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5.0.0
with:
images: ghcr.io/${{ github.repository }}
- name: Build and push the Docker image
uses: docker/build-push-action@v5.0.0
with:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
เท่านี้ก็จบกันไปแล้วสำหรับการใช้งาน CI/CD บน Github Action & runner ก็หวังว่าทุกคนที่เข้ามาอ่านกันจะสามารถใช้งานได้ และเป็นประโยชน์ต่อทุกคนนะครับ หากมีข้อสงสัยอะไรใดๆก็สามารถสอบถามมาได้ทาง facebook เลยครับ
ขอบคุณที่อ่านจนจบนะครับ🙃