ทำ Private npm ด้วย NEXUS

Source code ของข้า Lib ของข้า

เมื่อทำงานในบริษัทเอกชน Source code ที่เราผลิตขึ้นมาผ่านมันสมอง(ที่ไม่รู้ดีหรือแย่)ถือเป็นทรัพย์สินของบริษัท ซึ่งบางครั้งตัว Source code พวกนี้เป็นความได้เปรียบของบริษัทเช่น ตัว Gen app, Lib ที่เป็น Utility ที่ใช้กันบ่อยๆ ซึ่งมันสามารถ Reuse ใช้กับงานอื่นในบริษัทได้ จากที่ต้องทำงาน 100 เปอร์เซ็น งานใหม่อาจจะเหลือสัก 20 เปอร์เซ็น ซึ่งทางบริษัทไม่อยากจะให้ใครเอาไปใช้ ก็แน่ล่ะเขียนแทบตายอยู่ดีๆอีกบริษัทชุบมือเปิบ Code เราไปใช้ซะงั้น มันเลยตามมาด้วยการเขียน Lib และเก็บไว้ที่เครื่องใครเครื่องมัน นานๆทีก็เอามารวมกันเป็น Lib ของบริษัทนะ แล้วก็ส่งต่อกัน ไอ Lib พวกนี้เนี่ยบางทีมันก็มี Bug ซ่อนอยู่ พอเราใช้งานแล้วเจอก็แก้ ต่างคนต่างแก้ บางคนไม่เจอก็ไม่แก้ บางคนแก้ก็ยิ่งแย่ พอจะมารวม Code อีกที ก็โอ้

ไอตัวคนเขียน Blog นี่ก็เจอเหมือนกัน เขียน DAO ให้คนอื่นใช้ พอสักพักมาเจอ Bug ที่ตัวเองเขียนก็แก้ แต่คนที่ Lib เราไปใช้ก็ไม่รู้ พอเขียนไปเจอ Bug ก็ช็อค กลับไปแก้ส่วนที่ผมแก้ไปแล้วซึ่งจริงๆไม่ต้องแก้แค่เราไม่ได้รวม Code กัน จริงๆปัญหาเหล่านี้ไม่ต้องใช้ Tools ที่ผมกำลังพูดถึงมาแก้ปัญหาก็ได้นะ แค่บริหารจัดการกันดีๆ เช่น 1 เดือนเอา Code มารวมกันแก้ conflict กัน หรือเวลาเจอ Bug ต้องแจ้งใคร แจ้งเสร็จแล้วจะเป็นยังไง แก้เลยหรือส่ง code ให้เขาดูแล้วแก้อะไรประมาณนี้ หรือจริงๆจะเอาขึ้น npm กลางเลยก็ได้นะถ้าไม่ได้หวง หรือ คิดว่าเอาขึ้นไปแล้วไม่มีคนสนใจก็เอาขึ้นไปได้ มีคำคมตอนเรียนวิชา OOAD ตอนปี 4 อาจารย์ประจำวิชาบอกไว้ว่า

Tools ดีแต่คนคนใช้ Design ไม่เป็นมันไม่ได้ช่วยให้ได้ Design ที่ดี แต่มันช่วยให้ได้ขยะเร็วขึ้น

สุดท้ายต่อให้มี Tools ดีเลิศประเสริฐศรีแค่ไหนแต่ไม่คุยไม่บริหารจัดการก็ไม่ได้ช่วยให้อะไรดีขึ้น ดังนั้นลองคุยกันก่อนว่ามี Tools นี้ขึ้นมาเพื่ออะไร ช่วยอะไร มันช่วยให้ชีวิตดีขึ้นยังไง จริงๆตัวคนเขียนเองก็ยังไม่เคยคุยบริษัทตัวเองทำงานด้วยเลยนะว่าจะเอาไอนี่ไปใช้ แต่ลองเล่นมันดูก่อนว่ายากไหม ถ้ายากไปคงไม่เอาไปใช้

เหตุผลที่อยากทำ private repo

อันนี้เป็นความคิดของผมที่อยากเอาไปแก้ปัญหาที่มีอยู่กับบริษัทที่ผมทำงานอยู่

  1. อยากจะจัดการเรื่อง source กลางของบริษัทคือ ตอนนี้บริษัทผมไม่มีเก็บ source code กลางที่เอาไปใช้หลายๆ project ตอนนี้เขาใช้วิธี copy วาง คราวนี้เวลาแก้ก็ต้องไปไล่แก้ทุก project ซึ่งบาง project ก็อาจแก้แล้วที่อื่นพอไปแก้ตรงนี้ก็ส่งผลกระทบ จับมันไว้ที่เดียว แก้ที่เดียวโดนทุก Project ไปเลย

  2. ทำให้สามารถ Reuse lib กลางได้อย่างเต็มที่คือก่อนเขียนอะไรก็ลองมาดูที่ repo กลางก่อนว่ามี lib อะไรที่เขียนไปแล้วบ้างจะได้ไม่ต้องไป Implement ใช้เองเสียเวลา

ตอนนี้ความคิดผมคิดได้เท่านี้แหละ เพราะโดนทำให้เจ็บเพราะเรื่องพวกนี้บ่อย แก้แล้วทำไมไม่ไล่แก้ให้หมดทุก Project กับ เขาเขียนไว้แล้วทำไมไม่ขอมาใช้

ทำไมถึงใช้ Nexus

อย่างแรกเลยคือ “ฟรี” โว้ย คือจะเอาอะไรใหม่ไปให้บริษัทใช้ถ้าเอาแบบเสียเงินไปเขาก็คงจะถามว่าจะใช้ได้จริงไหม ไปๆมาๆจะไม่ได้อนุมัติเอา หรือ พนักงานเฉือนเนื้อตัวเองไปลองแล้วไม่ได้ใช้ แต่ถ้าใช้ของฟรีล้มเหลวก็แค่เสียเวลากับพนักงานได้ความรู้ แต่ใครอยากได้แบบ Enterprise เขาก็มีบริการนะ อย่างที่สองคือมันรองรับตัว package ได้หลายตัวดีได้ทั้ง maven ของ java npm ของ js เห็นแว๊บๆว่าเก็บ docker image ได้ด้วย ตอนแรกกะใช้ Artifactory แต่มันต้องใช้แบบ pro ถึงจะใช้ npm ได้ ก็เลยเออตัวนี้แหละจัดๆไป

ลงเลยสิครับ

ยุคสมัยนี้ใครๆก็ใช้ Docker ดังนั้นเราก็ลงด้วย docker เลยสิครับลงง่าย พังก็ remove container ทิ้งลงใหม่ สำหรับใครที่ไม่เคยใช้ Docker สามารถอ่านได้ที่ https://www.jaynarol.com/what-is-docker/เขาเขียนไว้ดีบวกมีขั้นตอนให้ทำตามดังนั้นไปลองเลยครับไม่ยาก

1
2
# แค่ 1 บรรทัดเอง
docker run -d -p 8081:8081 --name nexus sonatype/nexus3

จริงๆวิธีสอนลงและรายละเอียดอื่นๆไม่ว่าจะเรื่อง build เองหรือ volume ข้อมูลที่เป็น Persistent สามารถดูได้ที่ Dockerhub ของ Nexus3 รายละเอียดพร้อมกว่าเยอะ

ลองสร้าง Repo เลยดีกว่า

เข้าตาม url เครื่องที่ map ไว้ของผมเครื่อง docker อยู่ที่ 192.168.56.101 ดังนั้น url เข้าเครื่อง docker ของผมเป็น http://192.168.56.101:8081 พอเข้าแล้วจะได้หน้าตาประมาณนี้

welcome page

ทำการ Sign in เลย
user : admin
password : admin123

จากนั้นกดไปที่รูปฟันเฟืองจะได้หน้าจออย่างในภาพแล้วกดตามทีวงแดงเลย
create repo

จากนั้นทำการสร้าง repo ของ npm ขึ้นมาได้เลย ซึ่งจริงๆทาง sonatype ได้มีขั้นตอนการสร้างอธิบายไว้แล้วโดยสามารถไปอ่านที่ลิ้งนี้เลย http://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packages

ขออธิบายคร่าวๆจากเว็บของ sonatype ที่เขาให้สร้าง 1 repo, 1 proxy, 1 group คือ

  • npm-private คือ npm private ของเรานั่นเองมีไว้เก็บ lib เก็บอะไรที่เป็นความลับของเรา
  • npm-proxy อันนี้คือไว้ต่อ npm ตัวฟรีที่เป้น public กล่าวคือถ้ามันหาใน private ไม่เจอมันไปหาที่ npm-proxy ให้ครับ
  • npm-group อันนี้คือการเอาหลายๆ npm-private , npm-proxy หลายๆตัวมารวมกันให้อยู่ใน url เดียว เวลา user ที่เป็น client มาขอใช้จะได้เข้าลิ้งนี้ลิ้งเดียว เดี๋ยวตัว nexus จะไปหาให้เองว่า package เนี้ยมันเป็นของ private หรือมันต้องไปหาที่ proxy

เปิดให้ nexus สามารถ authen ด้วย npm Bearer Token Realm

อันนี้คือเปิดให้สามรถ authen ด้วยวิธีของ npm โดยทำตามรูป ผมติดตรงนี้นานอยู่ จนไป search ว่า ต้องไปเปิดตรงนี้ก่อน เปิดปุ๊บได้ปั๊บ

npm_token

ลอง publish package กันดูดีกว่า

  1. สร้าง folder ขึ้นมาก่อนของผมสร้างชื่อว่า test_npm_repo

  2. เข้าไปใน folder แล้วทำการสั่ง

    1
    npm init

    มันจะถามเกี่ยวกับชื่อ project และอื่นๆ อันนี้เราแค่ลองเราก็กด enter รัวๆไป แต่ถ้าสร้างจริงจังควรอ่านให้ละเอียดและเลือกให้ถูกต้อง เมื่อทำแล้วเราจะได้ไฟล์ชื่อ package.json มา

  3. ทำการสร้างไฟล์ .npmrc

    1
    2
    _auth=YWRtaW46YWRtaW4xMjM=
    email=your_email@email.com

    _auth : มันค่าของ base64 ของ user:password ในที่นี้คือ admin:admin123 สำหรับใครใช้ user password อื่นก็เอามาข้อมูลมาต่อกันตามรูปแบบแล้วเข้า base64 ครับ
    email : ใส่เป็น email ของท่านนะครับ

  4. สร้าง README.md

    สร้างโดยสร้างไฟล์ README.md ข้างในจะเขียนอะไรก็ได้อย่างของผมเขียนว่า Hello world ครับ

    1
    # HELLO WORD
  5. สร้างไฟล์ index.js

    ไฟล์นี้เป็นไฟล์กลางสำหรับเวลาคนอื่น require มันจะมาเรียกไฟล์นี้แล้ว export ออกไปให้ ของผมเอาง่ายๆจะใส่เป็น

    1
    2
    3
    exports.test = function() {
    console.log("HELLO WORLD");
    }
  6. ลอง publish สิครับรออะไร
    อันนี้ผม publish ไปที่ private-repo นะ ไม่ต้อง publish ไปที่ group หรือ proxy

    1
    npm publish --registry  http://192.168.56.101:8081/repository/npm-private/

    ใช้คำสั่งด้านล่าง แต่ตรง url ของผมเป็นอย่างงี้ แต่ของคุณสามารถไป copy ได้จากตรงนี้

    ถ้า publish สำเร็จจะไม่มี Error แดงๆจาก npm และมันก็จะไปขึ้นที่หน้า repo ของเราด้วยอย่างงี้ (ของคุณน่าจะมีแค่อันเดียว พอดีของผมลองทำเป็นหลาย version)

ลอง install ตัว package จาก private repo ดู

  1. สร้าง folder ขึ้นมาสักอันก่อนของผมสร้างชื่อว่า test_download

  2. สร้าง .npmrc ขึ้นมา
    โดยเนื้อข้างในเป็นประมาณนี้

    1
    2
    registry=http://192.168.56.101:8081/repository/npm-group/
    _auth=YWRtaW46YWRtaW4xMjM=

    ตรง registry เปลี่ยนตาม npm-group ของคุณนะครับว่ามันอยู่ที่ไหน วิธีดูคล้ายกับดู private เลย

  3. ลองเลย

    1
    npm install test_npm_repo

    ตัว package จะมาอยู่ในเครื่องแล้ว

ปิดอย่าให้คนนอกมาใช้

สร้างทุกอย่างเสร็จแล้วอันนี้มาถึงสุดท้ายคือปิดไม่ให้คนนอกมาใช้งานกับเราได้ ซึ่งปกติตัว Nexus มันจะเปิด public ให้ใครเข้ามาใช้มาดู repo ได้ ดังนั้นเราต้องปิดนะครับ โดยวิธีปิดคือ ติ๊ก Allow anonymous users to access the server ออกตามภาพ

set privte

ขอตัดจบแค่นี้ก่อนละกันครับ

จริงๆยังมีอีกหลายเรื่องที่ยังไม่พูดถึง (เพราะยังทำไม่เป็น) ไม่ว่าจะเป็นทำยังไงให้เป็น HTTPS การกำหนดสิทธิ์ต่างๆ แต่ผมลองเล่นคร่าวๆมีกำหนดสิทธิ์ให้ใช้เหมือน usermanagement ทั่วไปแต่ยังไม่ลงรายะเอียดเกี่ยวกับสิทธิ์ว่าทำอะไรได้บ้าง

"สิ่งที่ผมเขียนขึ้นเป็นเพียงความรู้และความเข้าใจของบุคคลเพียงบุคคลเดียว ดังนั้นอย่าเพิ่งเชื่อในสิ่งที่ผมเขียนและอธิบาย ลองทำความเข้าใจว่ามันเป็นจริงอย่างนั้นไหมและลองหาแหล่งอ้างอิงอื่นๆว่าเขามีแนวคิดอย่างไร เรื่องการ Design และวิธีการใช้งานไม่มีถูกไม่มีผิดมีแต่เหมาะสมกับงานนั้นไหม"

ref :
https://www.jaynarol.com/what-is-docker/
http://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packages
https://help.sonatype.com/display/NXRM3/Node+Packaged+Modules+and+npm+Registries