Featured image of post วิธีตั้งค่า GitLab Private NPM Registry? แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการหลายแพ็คเกจและสิทธิ์

วิธีตั้งค่า GitLab Private NPM Registry? แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการหลายแพ็คเกจและสิทธิ์

แก้ปัญหาการตั้งค่า GitLab Private NPM Registry รวมถึงตรรกะ .npmrc การจัดการหลายแพ็คเกจ และการแก้ไขปัญหา 404 พร้อมแนวทางปฏิบัติที่ดีที่สุดสำหรับการรวม Registry

คุณกำลังพยายามใช้ Private Package ในโปรเจ็กต์ของบริษัทแต่ติดอยู่ที่การตั้งค่า .npmrc หรือไม่?

ทำไมคุณยังคงได้รับ 404 Not Found แม้ว่าจะตั้งค่า Token แล้วก็ตาม?

เมื่อบริษัทมีหลายทีมและหลายแพ็คเกจ (เช่น @frontend, @backend) คุณจะจัดการ .npmrc อย่างสง่างามได้อย่างไร?

ไขความกระจ่างสองความเชื่อผิดๆ เกี่ยวกับ .npmrc

เพื่อทำความเข้าใจ .npmrc คุณต้องเข้าใจว่ามันทำงานอย่างไรก่อน

พูดง่ายๆ ตรรกะหลักของมันมีแค่สองอย่าง: Scope Mapping และ Authentication

1. Scope Mapping

สิ่งนี้บอก npm ว่า: เมื่อคุณเห็นแพ็คเกจที่ขึ้นต้นด้วย @company อย่าไปที่ npmjs.org อย่างเป็นทางการ ให้ไปที่ GitLab Registry ที่เรากำหนด

@company:registry=https://gitlab.com/api/v4/groups/100/-/packages/npm/

2. Authentication

เมื่อมีที่อยู่แล้ว คุณต้องมีกุญแจ กุญแจคือ AuthToken ของคุณ

นี่คือกฎที่สำคัญอย่างยิ่ง: Registry URL และเส้นทาง AuthToken ต้อง “ตรงกันทุกประการ”

# ✅ Correct: เส้นทางเหมือนกับ registry ที่กำหนดไว้ข้างต้นทุกประการ
//gitlab.com/api/v4/groups/100/-/packages/npm/:_authToken=${GITLAB_TOKEN}

# ❌ Incorrect: เส้นทางไม่ตรงกัน ซึ่งจะทำให้เกิดความล้มเหลวในการอนุญาต
//gitlab.com/api/v4/:_authToken=${GITLAB_TOKEN}

หลายคนล้มเหลวในการตั้งค่ามักเป็นเพราะเส้นทางมีเครื่องหมายทับเกินมาหนึ่งตัวหรือขาดไปหนึ่งระดับ

Dependency Hell และข้อผิดพลาด 404

สถานการณ์ที่น่าปวดหัวที่สุดคือ: คุณติดตั้งแพ็คเกจ A ซึ่งขึ้นอยู่กับแพ็คเกจ B (ซึ่งเป็นส่วนตัวเช่นกัน) และจากนั้น npm ก็พ่น 404 Not Found ออกมา

ทำไมถึงเกิดขึ้น? นั่นเป็นเพราะเมื่อ npm แก้ไขการพึ่งพา หากไม่มีความสัมพันธ์ที่ถูกต้อง มันก็จะหลงทาง

โดยเฉพาะอย่างยิ่งเมื่อคุณมีสอง Scope ที่แตกต่างกัน (เช่น @team-a และ @team-b) ใน GitLab Group ที่แตกต่างกัน .npmrc จะซับซ้อนและยากต่อการบำรุงรักษาอย่างยิ่ง นอกจากนี้ Registry ที่แตกต่างกันอาจต้องการ Token ที่แตกต่างกัน แค่จัดการตัวแปรสภาพแวดล้อมเหล่านี้ก็เหนื่อยแล้ว

มีวิธีที่ฉลาดกว่านี้ไหม?

แนวทางที่แนะนำ: Unified Download Group Registry & Independent Publish Project Registry

Registry คำอธิบาย
Group Registry เพื่อให้สามารถรวบรวมการดาวน์โหลดแพ็คเกจทั้งหมด ให้ตั้งค่า Group Registry เพื่อดาวน์โหลดแพ็คเกจทั้งหมดภายใต้ Gitlab Group นี้
Project Registry สำหรับสิทธิ์ในระหว่างการเผยแพร่ แต่ละโปรเจ็กต์สามารถตั้งค่า Project Registry ของตนเองสำหรับการเผยแพร่

ทำไมต้องทำแบบนี้?

เหตุผล คำอธิบาย
ติดตั้งง่าย สามารถติดตั้งและดาวน์โหลดแพ็คเกจทั้งหมดในกลุ่มเดียวกันได้อย่างง่ายดาย
เผยแพร่ง่าย สามารถเผยแพร่แพ็คเกจไปยังโปรเจ็กต์ของตนเองได้อย่างง่ายดาย หลีกเลี่ยงแพ็คเกจที่แตกต่างกันเผยแพร่ไปยัง Registry เดียวกัน แต่ละโปรเจ็กต์มี Registry ของตนเอง
จัดการ Token ได้ง่าย ไม่ว่าจะบนคอมพิวเตอร์ของนักพัฒนาหรือสภาพแวดล้อม CI/CD ก็ต้องดูแล GITLAB_NPM_TOKEN เพียงชุดเดียว
หลีกเลี่ยงข้อผิดพลาด Dependency แพ็คเกจส่วนตัวทั้งหมดอยู่ในที่เดียวกัน npm จะหาเจอแน่นอน

การกำหนดค่าในการใช้งานจริง

คุณสามารถคัดลอกเทมเพลตนี้ได้โดยตรง:

อย่าลืมมอบหน้าที่ในการปกป้อง Token ให้กับตัวแปรสภาพแวดล้อม ห้ามเขียน Token ลงในโค้ดโดยเด็ดขาด!

# .npmrc
# @company scope ใช้ group level registry
# แพ็คเกจ @company/* ทั้งหมดจะติดตั้งจาก registry นี้
@company:registry=https://gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/

# การตั้งค่าการรับรองความถูกต้อง GitLab npm registry
# ใช้ common gitlab.com auth token (ครอบคลุมคำขอระดับ group และ project ทั้งหมด)
//gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}
# ใช้ project registry เพื่อเผยแพร่แพ็คเกจ
//gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}


# แพ็คเกจสาธารณะอื่นๆ ยังคงไปที่ official registry
registry=https://registry.npmjs.org/

กำหนดค่า publishConfig ใน package.json เพื่อเผยแพร่แพ็คเกจไปยัง GitLab Project Registry ที่เกี่ยวข้อง

{
  "name": "@company/my-package",
  "publishConfig": {
    "@company:registry": "https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/"
  }
}

บทสรุป

ด้วยกลยุทธ์ “Unified Download Group Registry” และ “Independent Publish Project Registry” เราสามารถลดค่าใช้จ่ายในการบำรุงรักษาได้อย่างมากและทำให้ขั้นตอนการพัฒนาราบรื่นขึ้น

เป้าหมาย คำอธิบาย
การจับคู่ที่แม่นยำ Scope mapping และเส้นทาง Token ต้องตรงกันทุกประการ
ปลอดภัยไว้ก่อน ใช้ตัวแปรสภาพแวดล้อม ${GITLAB_NPM_TOKEN} เพื่อจัดการข้อมูลส่วนตัว
การจัดการแบบรวมศูนย์ ให้ความสำคัญกับการใช้ GitLab Group ที่เป็นหนึ่งเดียวเพื่อ ดาวน์โหลด แพ็คเกจส่วนตัวทั้งหมดของบริษัท
การเผยแพร่แบบอิสระ ให้ความสำคัญกับการใช้ GitLab Project ที่เป็นอิสระเพื่อ เผยแพร่ แพ็คเกจส่วนตัวแต่ละรายการ จัดการแพ็คเกจอย่างอิสระเพื่อหลีกเลี่ยงความวุ่นวาย

เมื่อเข้าใจตรรกะเหล่านี้แล้ว GitLab NPM Registry จะเป็นผู้ช่วยที่ทรงพลังในกระบวนการพัฒนาของบริษัทคุณ!

All rights reserved,未經允許不得隨意轉載
ถูกสร้างด้วย Hugo
ธีม Stack ออกแบบโดย Jimmy