The Cloud Camp Week#10 (CI/CD – GitHub Action)

สัปดาห์นี้ Slide Event ของ DevOcean แยกร่างไม่ทัน ตอนแรก Plan จะได้วันเดียว ได้ไป 2 งานซะงั้น Architecture (plan) / Backend (Unplan) และมีเรื่องวุ่นวายในที่ทำงานพอสมควรเลย หัวร้อน และงานเข้า > ง่วงมากกก

Application Delivery

  • Application Delivery
    - ง่ายสุด Copy แปะลง Config มือ ผ่าน Physical Medium - Floppy Disk (ย้อนไปนึกถึงตอนส่ง Code การบ้านภาษา C) / Flash Drive / CD
    - ถัดมายุค VM > Cgroups (การแบ่ง namespace แต่ใช่ยาก) > Container (พวก docker / podman)
    - ยุคล่าสุด VM เยอะ Container เยอะ ต้องมีตัว orchestration เข้ามาจัดการ อย่าง K8S มาจัดการ
  • DevOps - มีนานแล้วยุค 2000 ปรับ Culture ให้ Fast Change / Fast Feedback / High Quality พอมาทางนี้แล้วพวก Tools ต่างๆมารองรับ และ Automation ด้วย
  • Recap Application Process / Application Deploy เอามาจาก Week#02 ลองไปอ่านดูครับ

Source code เป็น intellectual property (ทรัพย์สินทางปัญญา มีมูลค่าทางธุรกิจ) มันสำคัญ เลยมีการ Keep Version เช่น Git

ตอนทำงานมีการแยกกิ่ง(Branch) เพื่อความปลอดภัย ฮ่าๆ

  • การทำงานของ Application Delivery ยุคนี้ CI/CD

CI/CD

This image has an empty alt attribute; its file name is image-18-1024x575.png
สัปดาห์นี้ Blog เยอะ ขี้เกียจวาดใหม่ เอาของเดิมมาแปะก่อน 555

Continuous Deployment - Continuous Integration + Continuous Delivery

  • Continuous Integration - Check Code Health
    - Trigger [CODE CHANGE / Ad-hoc]
    - LINT ตรวจสอบตาม Gulide line ของแต่ละภาษา
    GATE: ถ้า LINT ผ่านไปต่อ
    - TEST ตรวจสอบว่ายังทำงานได้เหมือนเดิม โดย Test พวก Unit Test / Integration Test / Component Test / Contraction Test
    GATE: ถ้า TEST ผ่านไปต่อ
    - BUILD ตรวจสอบว่าสร้าง executable ได้
    GATE: ถ้า BUILD ผ่านไปต่อ

Note Step Build / Test อาจจะสลับกันได้ แล้วแต่ภาษา

  • Continuous Delivery - Check Deployment Health
    - PUBLISH เอา Artifact ของที่ได้จากตอน [BUILD] / [TEST] ขึ้นไปเก็บไว้ใน Repository หรือ พวก Storage
    GATE: ถ้า อาจจะทำ Security Check หรือ ตรวจ Sonar ที่มันทำนานๆ
    - DEPLOY - App ของเรา มาติดตั้ง นอกจากนี้ตัว Infra ยังทำเป็น Code ตามแนวคิด Infrastructure as Code (IaC) > Initial ตาม Code ที่กำหนดไว้เลย

ทั้ง CI/CD ต้องเป็น Automate เพื่อให้เกิด Fast Feedback Loop โดยเชื่อมกับตัว Version Control เพื่อให้มี Event มา Trigger CI+CD ทำงาน

นอกจากตัวความถูกต้องในตัว CI/CD ยังมีตรวจเรื่องอื่นๆ security + compliance checks โดยในตอนนี้มี Keyword ใหม่ DevSecOps

Popular CI/CD: Github Action / Spinnaker (เหมาะกับระบบใหญ่) / GitLab / Jenkins / Jenkins X (For K8S + แก้ความเจ็บปวดของ Jenkins ปล. ไม่เคยลอง)/ Tekton CD/ ArgoCD / Circle CI / Travis-CI

GitHub Action

GitHub Action = Platform Build In CI/CD โดยมีส่วนสำคัญ

  • Workflows การทำงานของ Pipeline ในรูปแบบไฟล์ yaml โดยอยู่ใน .github/workflows และทำงานตาม Events ที่กำหนด
  • Events - ตัวที่ Trigger Workflows
  • Jobs ขั้นตอนการทำงาน (Steps) ใน Workflow
    Note: Default แต่ละ Job ทำงานแบบ Parallel
  • Action การทำงานใน Job โดยมีแบบที่เราเขียนเอง หรือจะเอาที่คนอื่นแชร์จาก Marketplace มาใช้งานได้เลย
    - Setup ตามภาษาก็ได้ เช่น Node / dotnet / Spring เป็นต้น
    - CodeQL - Scan Code ฟรี
  • Runners server run ตัว workflows โดยมีตัว
    - GitHub Agents: Ubuntu Linux, Microsoft Windows, macOS
    - Self-Host Agents: เอาเครื่องเราไปให้ GitHub มาสั่งให้ทำงาน

Dependabot ตัวช่วย a pull request กรณีที่ Dependency มี update หรือ security patch

Ref: Keep all your packages up to date with Dependabot - The GitHub Blog
- Expression
  • การตีความคำสั่งใน ปีกกา ${{ -expression- }} ว่ามันต้องการอะไร ปกติจะเป็นพวก If
env:
 myNull: ${{ null }}
 myBoolean: ${{ false }}
 myIntegerNumber: ${{ 711 }}
 myFloatNumber: ${{ -9.2 }}
 myHexNumber: ${{ 0xff }}
 myExponentialNumber: ${{ -2.99e-2 }}
 myString: Mona the Octocat
 myStringInBraces: ${{ 'It''s open source!' }} 
 # Single Quote (') เอาไว้แสดงตัวอักขระพิเศษ
 # result: It's open source!
env:
 MY_ENV_VAR: ${{ github.ref == 'refs/heads/main' && 'value_for_main_branch' || 'value_for_other_branches' }}

Ref: Expressions - GitHub Docs

- Contexts

บอกข้อมูลตัว GitHub Action เป็นตัวแปรกลางให้เราเรียกใช้ เช่น

  • github บอกข้อมูล workflow และ info ของ github เรา เช่น Branch / user
  • env - เอาไป Set ใน Agent
  • vars
  • job
  • อื่นๆ

Ref: Contexts - GitHub Docs

- Variables
  • Define
    - ใน WorkFlow
    - UI
    ➡ ปกติ ประกาศไป แล้วเอาไปอ้างอิงใน workflow ใช้
    ➡ Secrets ถ้าเก็บในนี้ เวลา Run WorkFlow มันจะไม่แสดงใน Log
    Note: ถ้ามีอะไรที่ซ้ำกันขององค์กร ประกาศไว้เป็น Global ให้ Share
  • Access Level ใน Workflow inline จะได้สิทธิสูงสุด เหมือนกับทาง Jenkins
name: Greeting on variable day

on:
  workflow_dispatch

#GLOBAL SCOPE
env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    #JOB SCOPE
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        #STEP / ACTION SCOPE ถ้ามีซ้ำกันเชื่ออันที่เล็กที่สุด เหมือน Coding ปกติ
        env:
          First_Name: Mona

Ref: Variables - GitHub Docs

- Sample Flow - เอาขึ้น GitHub Page
name: 'build and deploy production'

#Events - ตัวที่ Trigger Workflows
on:
  push:
    tags:
      - '*'

jobs:
  #Job แรก Build + Test
  build-production-job:
    #กำหนด Runners 
    runs-on: ubuntu-latest
    #ใน Step 
    steps:
      #Check out Code
      - uses: actions/checkout@v4
      #กำหนด node version
      - name: Set nodejs verstion to 18.x
        uses: actions/setup-node@v3
        with:
          node-version: '18.x'
          cache: 'npm'
      #Run Commmand ถ้าได้นะ ถ้าไทมี GitHub Action
      - run: npm ci

      - name: Run build production (create dist folder)
        run: npm run build
      #เอาไฟล์จาก GitHub artifacts
      - name: Upload dist folder artifacts
        uses: actions/upload-artifact@v3
        with:
          name: dist-prod
          path: dist
  #Job สอง
  deploy-to-production:
    needs: build-production-job
    runs-on: ubuntu-latest
    steps:
      - name: Download dist folder artifacts
        uses: actions/download-artifact@v3
        with:
          name: dist-prod
          path: dist
                
      - run: ls dist
      #Check Build Folder
      #document: https://github.com/xRealNeon/VuePagesAction
      #action: https://github.com/SerhiiKa/VuePagesAction

      - uses: actions/checkout@v4
      - name: publish vue to github pages
        uses: SerhiiKa/VuePagesAction@1.0.4
        with:
          username: ${{ github.actor }} 
          reponame: ${{ github.event.repository.name }}
          token: ${{ secrets.GITHUB_TOKEN }}

สำหรับ Workshop วันเสาร์ ได้ลองที่เรียนมาหมด CI / CD - ทำ Git Action Code > Containerized > K8S ลองดูได้จากนี้เลย week9-1010/javascript/README.md at develop · pingkunga/week9-1010 (github.com)

อีกที่อึ้งกับความสามารถ ตัว yq มันแก้ได้ขนาดนี้เลย เมื่อก่อนคง sed เอาแล้ว หรือไปท่า powershell เรียก dotnet api replace

Git Action มันสั้นกว่า Jenkins เยอะม๊ากกกกกกกกก ถ้าเขียนที่คงได้เรียก Shell ทั้งไฟล์ (Reuse by shell / powershell)

มี ฺBlog เขียนไว้ด้วย น่าจะลองตอนเล่น Azure DevOps [AZ-400] Implement CI with Azure Pipelines and GitHub Actions (Part2) | naiwaen@DebuggingSoft

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.