สัปดาห์นี้ 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
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
- อื่นๆ
- 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
- 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
- GitHub Actions documentation - GitHub Docs
- About continuous integration - GitHub Docs
- continuous integration - How to use the GitHub Actions `workflow_run` event? - Stack Overflow
- GitHub Action - yq (gitbook.io)
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.