ทำ CI/CD บน GitHub ด้วย GitHub Action & runner

ทำ CI/CD บน GitHub ด้วย GitHub Action & runner

สำหรับการพัฒนา 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 ของเรา

📌
ในการ setup runner บน github เราจะต้องเลือกว่าเราจะใช้งาน runner กับกี่ repository ถ้าหากว่าใช้งาน repository มากกว่า 1 repo ผมแนะนำให้สร้าง Organization และเพิ่ม runner ใน Organization เพื่อให้ share runner ร่วมกันได้ แต่ถ้าหากคุณต้องการใช้แค่ repo เดียวก็สามารถเพิ่ม runner เข้า repo ได้เลย

การเพิ่ม runner เข้า repository หรือ organization

setting
Action

ในเมนู setting ที่ bar ด้านซ้ายจะมีแถบ Actions อยู่ในเลือกไปที่ Runner โดยเราจะเพิ่ม runner ของเราตรงนี้

Runner

โดยตรงนี้ให้กดที่ new self-hosted runner ได้เลย

Create 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 ได้เลย

status

การใช้งาน

สำหรับการใช้งาน Github Action หลังจากที่เราติดตั้ง runner กันแล้วต่อไปเรามาทำส่วนที่จะไปสั่งงาน runner กันซึ่งเราจะต้องเขียนสิ่งที่เรียกว่า workflow มีไว้ไปสั่ง runner ว่าให้ทำอะไรบ้างเป็นลำดับๆ

โดยใน repo ของเราจะต้องมีการสร้างไฟล์ไว้ที่ path ที่กำหนด หรือสามารถสร้างจาก template ได้เลยโดยสามารถดูได้จาก Actions

action template
workflow template

เมื่อเราเลือก 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 ตามนี้

name: docker-compose-actions-workflow
on: push
jobs:
  build:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v3
      - name: Build App
        run: docker-compose up --force-recreate --build --detach

compose.yml

จาก workflows ด้านบนเมื่อมีการ push code ลงใน git จะ เริ่มทำงานตาม workflow โดย Action จะโหลด code ของคุณไปที่ runner และเริ่มทำงานตาม workflow คือ รันคำสั่ง docker-compose ในระหว่างการทำงานเราสามารถเข้าไปดูสถานะ หรือ log ได้ผ่าน github ได้เลย โดยเข้าไปที่เมนู Action

status

โดยในหน้านี้เราสามารถดูสถานะได้ว่าทำไปถึงไหนแล้วในกรณีที่เรามีหลาย step ใน workflow และในแต่ละอันเราสามารถกดเข้าไปดู log ได้ และเมื่อจบ workflows app ของเราก็จะรันอยู่ในเครื่อง runner เป็นที่เรียบร้อย เราก็ไปใช้ต่อได้เลยย

ℹ️
ในการใช้คำสั่งใน workflow เช่นจะใช้ docker-compose บนเครื่อง runner ของเราจำเป็นที่จะต้องติดตั้ง dokcer , docker-compose ไว้ก่อน

หรือถ้าใครอยากที่จะ 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 เลยครับ

ขอบคุณที่อ่านจนจบนะครับ🙃

อ้างอิง