ฉันจะใช้การดําเนินการ GitHub เพื่อสร้างเวิร์กโฟลว์สําหรับ CI ได้อย่างไร

เสร็จสมบูรณ์เมื่อ

โปรดทราบว่าเป้าหมายของคุณคือการทําให้กระบวนการสร้างและเผยแพร่โค้ดเป็นแบบอัตโนมัติเพื่อให้คุณลักษณะได้รับการอัปเดตทุกครั้งที่นักพัฒนาเพิ่มการเปลี่ยนแปลงไปยังฐานโค้ด

หากต้องการใช้กระบวนการนี้ คุณจะเรียนรู้วิธีการ:

  • สร้างเวิร์กโฟลว์จากเทมเพลต
  • หลีกเลี่ยงการทําซ้ําโดยใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้
  • ทดสอบกับหลายเป้าหมาย
  • แยกงานการสร้างและการทดสอบ

สร้างเวิร์กโฟลว์จากเทมเพลต

เมื่อต้องการสร้างเวิร์กโฟลว์ เป็นเรื่องปกติที่จะเริ่มต้นโดยใช้แม่แบบ เทมเพลตมีงานทั่วไปและขั้นตอนที่กําหนดไว้ล่วงหน้าสําหรับประเภทเฉพาะของการทํางานอัตโนมัติที่คุณกําลังใช้งาน ถ้าคุณไม่คุ้นเคยกับเวิร์กโฟลว์ งาน และขั้นตอน ให้ดู งานการพัฒนา Automate โดยใช้การดําเนินการ GitHub มอดูล

บนหน้าหลักของที่เก็บ GitHub ของคุณ เลือก การดําเนินการ จากนั้นเลือก เวิร์กโฟลว์ใหม่

บนหน้า เลือกเวิร์กโฟลว์ คุณสามารถเลือกจากเทมเพลตหลายชนิด ตัวอย่างหนึ่งคือเทมเพลต Node.js แม่แบบNode.js จะติดตั้ง Node.js และการขึ้นต่อกันทั้งหมด สร้างโค้ดต้นฉบับ และเรียกใช้การทดสอบสําหรับ Node.jsเวอร์ชันที่แตกต่างกัน อีกตัวอย่างหนึ่งคือ เทมเพลต แพคเกจ Python ซึ่งติดตั้ง Python และการอ้างอิง จากนั้นเรียกใช้การทดสอบ รวมถึง lint ใน Python หลายเวอร์ชัน

เมื่อต้องการเริ่มต้นด้วย Node.js Node.jsแม่แบบเวิร์กโฟลว์

สกรีนช็อตที่แสดงแท็บการดําเนินการ GitHub พร้อมกล่องค้นหาที่เน้นและด้วยข้อความ Node.js

ในผลลัพธ์การค้นหา ในบานหน้าต่าง Node.js ให้เลือก กําหนดค่า

สกรีนช็อตที่แสดงแท็บการดําเนินการ GitHub พร้อมบานหน้าต่าง Node.js ที่เน้นและปุ่มกําหนดค่าที่เลือก

ไฟล์ node.js.yml สําหรับโครงการของคุณจะถูกสร้างขึ้นจากเทมเพลต:

name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

ตามที่เห็นใน on แอตทริบิวต์ เวิร์กโฟลว์ตัวอย่างนี้จะทํางานเพื่อตอบสนองต่อการส่งไปยังที่เก็บหรือเมื่อคําขอดึงข้อมูลถูกสร้างขึ้นเทียบกับสาขาหลัก

เวิร์กโฟลว์นี้จะเรียกใช้งานหนึ่งงานที่บ่งชี้โดย job แอตทริบิวต์

แอตทริบิวต์ runs-on ระบุว่า สําหรับระบบปฏิบัติการ เวิร์กโฟลว์จะทํางานบน ubuntu-latest แอตทริบิวต์ node-version ระบุว่า มีสามรุ่น แต่ละรายการสําหรับ Node.js เวอร์ชัน 14.x, 16.x และ 18.x แอตทริบิวต์ matrix จะอธิบายในเชิงลึกในภายหลังในโมดูล

ใน jobs แอตทริบิวต์ ขั้นตอนใช้ การดําเนินการ/การดําเนินการ GitHub/checkout@v3 เพื่อรับโค้ดจากที่เก็บของคุณลงในเครื่องเสมือน (VM) และ การดําเนินการ/ตั้งค่า node@v3 เพื่อตั้งค่าเวอร์ชันที่ถูกต้องของ Node.js คุณระบุว่าคุณต้องการทดสอบ Node.js สามเวอร์ชันโดยใช้ ${{ matrix.node-version }} แอตทริบิวต์ แอตทริบิวต์นี้อ้างอิงเมทริกซ์ที่คุณกําหนดไว้ก่อนหน้านี้ แอตทริบิวต์ cache ระบุตัวจัดการแพคเกจสําหรับการแคชในไดเรกทอรีเริ่มต้น

ส่วนสุดท้ายของขั้นตอนนี้จะดําเนินการคําสั่งที่ Node.js โครงการใช้ คําสั่ง npm ci จะติดตั้งการขึ้นต่อกันจาก package-lock.json ไฟล์ npm run build --if-present เรียกใช้สคริปต์การสร้างถ้ามีอยู่ npm test เรียกใช้เฟรมเวิร์กการทดสอบ เทมเพลตนี้รวมทั้งขั้นตอนการสร้างและการทดสอบในงานเดียวกัน

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ npm โปรดดูเอกสารประกอบ npm:

ทีมนักพัฒนาสามารถใช้ประโยชน์จากการใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้เพื่อปรับปรุงและทําให้ขั้นตอนการทํางานโดยอัตโนมัติซ้ําๆ เป็นมาตรฐาน ด้วยการใช้เวิร์กโฟลว์ที่นํามาใช้ใหม่ คุณสามารถลดความซ้ําซ้อน ปรับปรุงการบํารุงรักษา และรับประกันความสอดคล้องในไปป์ไลน์การรวม/การปรับใช้อย่างต่อเนื่อง (CI/CD) ของคุณอย่างต่อเนื่อง

หลีกเลี่ยงการทําซ้ําโดยใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้

เมื่อขนาดของทีมและโครงการเพิ่มขึ้น เป็นเรื่องปกติที่จะเห็นขั้นตอนเดียวกันซ้ําในหลายไฟล์เวิร์กโฟลว์ ขั้นตอนเหล่านี้อาจรวมถึงการเช็คเอาท์โค้ด การติดตั้งแบบขึ้นต่อกัน การทดสอบ และการปรับใช้ การทําซ้ําประเภทนี้ไม่เพียง แต่ทําให้ฐานโค้ดของคุณรกแต่ยังเพิ่มเวลาการบํารุงรักษาเมื่อจําเป็นต้องมีการเปลี่ยนแปลงรหัส เวิร์กโฟลว์ที่นํามาใช้ใหม่ได้แก้ปัญหานี้ โดยอนุญาตให้คุณกําหนดตรรกะอัตโนมัติหนึ่งครั้ง แล้วเรียกใช้ตรรกะจากเวิร์กโฟลว์อื่น ๆ

เวิร์กโฟลว์ที่นํามาใช้ใหม่ได้คือ เวิร์กโฟลว์การดําเนินการ GitHub แบบพิเศษที่เวิร์กโฟลว์อื่น ๆ สามารถเรียกใช้ได้ คล้ายกับฟังก์ชันในการเขียนโปรแกรม คุณสร้างขึ้นเพื่อแชร์ตรรกะซ้ํา เช่น สร้างขั้นตอน ขั้นตอน การทดสอบ หรือกลยุทธ์การปรับใช้ หลังจากที่คุณสร้างเวิร์กโฟลว์ที่สามารถนํากลับมาใช้ใหม่ได้ คุณสามารถอ้างอิงจากเวิร์กโฟลว์อื่น ๆ ในที่เก็บข้อมูลเดียวกันหรือแม้แต่ในที่เก็บข้อมูลอื่นได้

ไดอะแกรมที่แสดงแนวคิดของเวิร์กโฟลว์ที่นํามาใช้ใหม่ได้ในการดําเนินการ GitHub ที่เก็บหรือเวิร์กโฟลว์หลายรายการสามารถอ้างอิงเวิร์กโฟลว์ส่วนกลางได้

เหตุใดจึงใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้

ต่อไปนี้คือประโยชน์ของการใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้:

  • ความสอดคล้อง ทีมสามารถทําตามมาตรฐานการทํางานอัตโนมัติเดียวกันในทุกโครงการได้
  • ประสิทธิภาพ แทนที่จะคัดลอกและวางขั้นตอน คุณเพียงแค่ชี้ไปยังเวิร์กโฟลว์ที่นํามาใช้ใหม่ได้
  • การอัปเดตที่ง่ายขึ้น เมื่อกระบวนการเปลี่ยนแปลง เช่น โดยการเพิ่มขั้นตอนการทดสอบ คุณอัปเดตในตําแหน่งที่ตั้งเดียว จากนั้น เวิร์กโฟลว์ทั้งหมดที่ใช้สิทธิประโยชน์ของเวิร์กโฟลว์โดยอัตโนมัติ
  • ความสามารถในการปรับขนาด เวิร์กโฟลว์ที่นํามาใช้ใหม่ได้เหมาะสําหรับแพลตฟอร์มหรือทีม DevOps ที่จัดการบริการหลายรายการ

ถัดไป สํารวจวิธีการใช้เวิร์กโฟลว์ที่นํามาใช้ใหม่เพื่อปรับปรุงโครงการของคุณ

ใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้

เมื่อต้องใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้:

  1. ในโฟลเดอร์ที่เก็บของคุณ ให้สร้างเวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้ ไฟล์ประกอบด้วยขั้นตอนอัตโนมัติที่คุณต้องการแชร์ เช่น ขั้นตอนทั่วไปที่เกี่ยวข้องในการทดสอบ การสร้าง และการปรับใช้
  2. เปิดใช้งานเวิร์กโฟลว์อย่างชัดเจนเพื่อให้สามารถนํามาใช้ใหม่ได้โดยการกําหนดค่าด้วย workflow_call เหตุการณ์
  3. ในเวิร์กโฟลว์หลักของคุณ (เวิร์กโฟลว์ผู้เรียก) ให้อ้างอิงไฟล์ที่สามารถนํากลับมาใช้ใหม่ได้นี้ และป้อนข้อมูลที่จําเป็นหรือข้อมูลลับใดๆ

เพื่อแสดงข้อดีของเวิร์กโฟลว์ที่นํามาใช้ใหม่ได้ ให้พิจารณาสถานการณ์จริงต่อไปนี้

ตัวอย่าง

ลองจินตนาการว่าองค์กรของคุณมี microservices 10 ตัว ไมโครเซิร์ฟทั้ง 10 หน่วยต้องมีขั้นตอนเดียวกันเพื่อ:

  • เรียกใช้การทดสอบ
  • โค้ด Lint
  • ปรับใช้กับสภาพแวดล้อมที่เฉพาะเจาะจง

หากไม่มีเวิร์กโฟลว์ที่นํามาใช้ใหม่ ที่เก็บแต่ละแห่งจะจบลงด้วยการทําซ้ําตรรกะเดียวกันในไฟล์เวิร์กโฟลว์หลายไฟล์ ซึ่งนําไปสู่ขั้นตอนที่ซ้ํากันและการบํารุงรักษาที่ยากขึ้น

ถ้าคุณใช้เวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้:

  • คุณกําหนดกระบวนการหนึ่งครั้งในไฟล์กลาง (ตัวอย่างเช่น ใน ci-standard.yml)
  • คุณเรียกใช้ไฟล์นี้จากเวิร์กโฟลว์ของ microservice ทุกตัว ที่ส่งผ่านตัวแปรเช่น สภาพแวดล้อม หรือชื่อแอปพลิเคชัน

หากมีการเพิ่มขั้นตอนหรือเครื่องมือความปลอดภัยใหม่ เช่น เพื่อสแกนหาช่องโหว่ ให้คุณเพิ่มได้เพียงครั้งเดียวในเวิร์กโฟลว์ที่นํามาใช้ใหม่ได้ ไมโครเซอร์วิซทั้ง 10 ตัวเริ่มใช้กระบวนการอัปเดตทันที คุณไม่จําเป็นต้องปรับเปลี่ยน 10 microservices

โดยการทําความเข้าใจวิธีการทํางานของเวิร์กโฟลว์ที่นํากลับมาใช้ใหม่ได้และประโยชน์ของพวกเขา คุณสามารถปรับใช้แนวทางปฏิบัติที่ดีที่สุดเพื่อเพิ่มประสิทธิผลให้มีประสิทธิภาพสูงสุด และมั่นใจได้ว่ามีการรวมเข้ากับไปป์ไลน์ CI/CD ของคุณอย่างราบรื่น

แนวทางปฏิบัติที่ดีที่สุด

  • รวมเวิร์กโฟลว์ที่สามารถนํากลับมาใช้ใหม่ได้ในพื้นที่เก็บเดียวเข้าด้วยกัน หากคุณวางแผนที่จะแชร์กับทั้งทีม
  • ใช้สาขาหรือแท็กเป็นเวอร์ชันเวิร์กโฟลว์ของคุณ (ตัวอย่างเช่น ใช้ @v1) เพื่อให้คุณสามารถย้อนกลับการเปลี่ยนแปลงได้อย่างง่ายดายถ้าจําเป็น
  • ป้อนข้อมูลในเอกสารและข้อมูลลับอย่างชัดเจน เวิร์กโฟลว์ที่นํามาใช้ใหม่ได้มักอาศัยข้อมูลป้อนเข้าและข้อมูลลับ ทีมจําเป็นต้องทราบว่าจะใช้ข้อมูลใด
  • หากคุณต้องการนําขั้นตอนกลับมาใช้ใหม่เพียงไม่กี่ขั้นตอน ให้รวมเวิร์กโฟลว์ที่นํามาใช้ใหม่ได้กับการดําเนินการแบบรวมแทนที่จะสร้างเวิร์กโฟลว์เต็มรูปแบบ

เวิร์กโฟลว์ที่นํามาใช้ใหม่ได้เป็นวิธีที่มีประสิทธิภาพในการบังคับใช้ความสอดคล้อง ลดการทําซ้ํา และปรับมาตราส่วนแนวทางปฏิบัติ DevOps ในทีมวิศวกรรมใด ๆ ไม่ว่าคุณจะจัดการที่เก็บเดียว ไมโครซอฟต์หรือไลบรารีแบบโอเพนซอร์ส เวิร์กโฟลว์ที่นํามาใช้ใหม่สามารถลดความซับซ้อนของการทํางานอัตโนมัติ ได้ดังนั้น CI/CD ของคุณจะเร็วขึ้น สะอาดขึ้น และง่ายขึ้นสําหรับคุณในการจัดการ

ปรับแต่งเทมเพลตเวิร์กโฟลว์

ที่จุดเริ่มต้นของโมดูลนี้ คุณพิจารณาสถานการณ์ที่คุณต้องการตั้งค่า CI สําหรับทีมนักพัฒนาของคุณ เทมเพลต Node.js เป็นการเริ่มต้นที่ยอดเยี่ยม แต่คุณต้องการปรับแต่งให้เหมาะกับความต้องการของทีมของคุณ คุณต้องการกําหนดเป้าหมายเวอร์ชัน Node.js และระบบปฏิบัติการที่แตกต่างกัน คุณยังต้องการให้ขั้นตอนการสร้างและการทดสอบแยกกันด้วย

นี่คือตัวอย่างของเวิร์กโฟลว์แบบกําหนดเอง:

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest]
    node-version: [16.x, 18.x]

ในตัวอย่างนี้ คุณกําหนดค่า เมทริกซ์การสร้าง สําหรับการทดสอบในหลายระบบปฏิบัติการและเวอร์ชันภาษา เมทริกซ์นี้สร้างสี่รุ่น หนึ่งรุ่นสําหรับแต่ละระบบปฏิบัติการจับคู่กับแต่ละเวอร์ชันของ Node.js

สี่รุ่นและการทดสอบสร้างข้อมูลบันทึกจํานวนมาก การจัดเรียงข้อมูลทั้งหมดอาจเป็นเรื่องยาก ในตัวอย่างต่อไปนี้ คุณย้ายขั้นตอนการทดสอบไปยังงานทดสอบเฉพาะ การทดสอบงานนี้กับหลายเป้าหมาย การแยกขั้นตอนการสร้างและการทดสอบทําให้ง่ายต่อการทํางานกับข้อมูลบันทึก

test:
  runs-on: ${{ matrix.os }}
  strategy:
    matrix:
      os: [ubuntu-latest, windows-latest]
      node-version: [16.x, 18.x]
  steps:
  - uses: actions/checkout@v3
  - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
      node-version: ${{ matrix.node-version }}
  - name: npm install, and test
    run: |
      npm install
      npm test
    env:
      CI: true