วิธีการเปิดใช้งานแคช NPM ใน Jenkins สร้างทาสที่ทำงานใน Docker?


13

ฉันมีภาพนักเทียบท่าเรียกมันfrontend.imageว่าฉันใช้สำหรับเจนกินส์สร้างทาส ปลั๊กอิน Jenkins Dockerจะหมุนคอนเทนเนอร์จากภาพนี้และสร้างสิ่งประดิษฐ์ภายในคอนเทนเนอร์ ทั้งหมดนี้ใช้งานได้ดี ในกรณีfrontend.imageนี้ใช้เพื่อสร้างแอป AngularJs ส่วนหนึ่งของการสร้างแอปพลิเคชันเชิงมุมนี้คือการติดตั้งแพคเกจ npm ที่แอปต้องการ

กระบวนการนี้ติดตั้ง npm ดูเหมือนจะใช้เวลานาน 3 นาทีดูเหมือนว่า npm จะติดตั้งทุกแพ็คเกจทุกครั้ง

ดังนั้นฉันจึงเพิ่มวอลลุ่มสำหรับทาสของฉันมันเป็นโวลุ่มที่เมาท์โฮสต์ปลั๊กอินนักเทียบท่าจะใช้วอลลุ่มนี้ทุกครั้งที่เรียกใช้คอนเทนเนอร์ส่วนหน้า:

ป้อนคำอธิบายรูปภาพที่นี่

ผู้ใช้ที่รันคำสั่งคือnpm install jenkinsNPM เก็บแคชซึ่งคุณสามารถหาได้ด้วยคำสั่งnpm config get cacheที่เอาต์พุต/home/jenkins/.npm

นั่นคือเหตุผลที่ฉันมีไดรฟ์ข้อมูลโฮสต์/slaves/volumes/tsl.frontend:/home/jenkinsติดตั้งกับทาสเว็บคอนเทนเนอร์ของฉัน

ฉันสร้างแอปพลิเคชัน Angular ของฉันโดยใช้โครงการ Jenkins สร้างไม่มีปัญหาติดตั้งแพคเกจ npm จำนวนมาก ถ้า ssh เข้าสู่โฮสต์ Docker ของฉันและเรียกใช้ cmd ls /slaves/volumes/tsl.frontendฉันเห็นแพ็คเกจ npm มากมาย นี่หมายความว่าเมานต์วอลลุ่มของฉันสำหรับทาสทำงาน ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันสร้างโครงการเจนกินส์อีกครั้ง npm ติดตั้งทุกแพ็คเกจเดียวอีกครั้งแม้ว่าคอนเทนเนอร์สร้างทาสของนักเทียบท่าจะใช้เมานต์โฮสต์ปริมาณ ฉันยังสามารถยืนยันได้ด้วยการทุบตีลงในคอนเทนเนอร์ทาสด้วย cmd docker exec -it <some_clever_random_container_id> bashจากนั้น cmd su jenkinsแล้ว cmd npm cache lsซึ่งแสดงรายการแพคเกจ npm จำนวนมากที่ถูกแคชไว้ ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นแม้จะมีปริมาณการเมานท์โฮสต์ของฉันซึ่งมีสิทธิ์chmod 777โดยวิธีการดังนั้นจึงไม่มีปัญหาสิทธิ์ฉันยังไม่สามารถnpm installใช้แคช

ในงานสร้างของเจนกินส์ซึ่งหมุนขึ้นnpm cache lsที่แท่นวางทาสสต็อกคำสั่งแรกที่ฉันเรียกใช้และมีหลายแพคเกจไว้ในรายการนี่ไม่ได้หมายความว่าไดรฟ์ข้อมูลโฮสต์ของฉันทำงานได้ตามที่คาดไว้และดัชนีแคช npm

ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้ลองใช้npm installcmd ปกติซึ่งเมื่อฉันรันบนเครื่อง localhost ของฉันจะติดตั้งแพ็คเกจทั้งหมดในครั้งแรกและแทบจะไม่มีแพ็คเกจเลยในครั้งต่อไป และยังเป็น "แฮ็ค" npm cache npm --cache-min 9999999 installซึ่งนำมาจากคำตอบ SO นี้และ cmdnpm --skip-installed --cache-min 9999999 install

คำถามที่เกี่ยวข้องถูกโพสต์ใน StackOverflow


ฉันจะเดิมพันดัชนีแคชไม่ได้ถูกเก็บไว้ภายใน ~ / .npm ตามคำอธิบายของคุณ
Tensibai

@ Tensibai คุณไม่ถูกต้องและฉันมั่นใจมากเกี่ยวกับเรื่องนี้ผู้ใช้คือเจนกิ้นส์เพราะนั่นคือสิ่งที่คุณพูดในอีกทางหนึ่งเพราะฉันใช้แคช npm ls ในฐานะผู้ใช้เจนกิ้นส์และแสดงรายการแพ็กเกจ ถูกดำเนินการโดยผู้ใช้รายอื่น
Brian Ogden

ไม่ฉันกำลังบอกว่าดัชนีตัวเองอาจถูกเก็บไว้ที่อื่นใน / usr / local หรือเส้นทางใดก็ตามที่ติดตั้งในส่วนของ PMP หรืออะไรก็ตามฉันไม่รู้เลย ดูเหมือนว่า npm จะทำตัวเหมือนไม่มีอะไรในแคชดังนั้นฉันเดาว่ามันจะไม่แสดงรายการไดเรกทอรี แต่อ้างอิงตัวเองกับดัชนีบางประเภทที่อื่น
Tensibai

@Tensibai แต่การกำหนดค่า cmd npm รับผลตอบแทนแคช / home/jenkins.npm เป็นเส้นทางที่คุณไม่คิดว่ายืนยันตำแหน่งของแคชหรือไม่
Brian Ogden

ตำแหน่งของแคชใช่ที่ไม่บังคับใช้ดัชนีแคชอยู่ในตำแหน่งเดียวกันเลย ฉันจะเพิ่ม a npm cache lsและ raw ls ~/.npm/* -alในสคริปต์การสร้างตัวเองก่อนขั้นตอนการสร้างอื่น ๆ เพียงเพื่อให้แน่ใจว่าสถานะของคอนเทนเนอร์เมื่อเริ่มต้นการสร้าง
Tensibai

คำตอบ:


5

ในที่สุดฉันก็แก้ปัญหานี้โดยใช้การแคชเลเยอร์อิมเมจแคชสำหรับการติดตั้ง npm ตามคำตอบนี้

นี่หมายความว่าฉันย้ายการติดตั้ง npm ออกจากอิมเมจทาสของ Docker และไปยังอิมเมจส่วนหน้าจริงนี่คือไฟล์นักเทียบท่าสุดท้ายของฉันที่แคชการติดตั้ง npm จริงระหว่างการสร้างหาก package.config ไม่มีการเปลี่ยนแปลง:

FROM centos:7
MAINTAINER Brian Ogden

# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1

RUN yum -y update && \
    yum clean all && \
    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
    yum -y makecache && \
    yum -y install nginx-1.12.0 wget

# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf

#############################################
# NodeJs Install
#############################################

#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
    | tar --strip-components=1 -xzf - -C /usr/local

# /programming//a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/

WORKDIR /app
COPY . /app

RUN npm run build-$ENVIRONMENT

RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf


EXPOSE 80

CMD ["nginx"]

2
มันไม่ได้แก้ปัญหาของคุณที่อธิบายไว้ในคำถาม เป็นอีกวิธีหนึ่งในการแคช คุณรู้เหตุผลหรือยัง @Brian
Nguyen

@AnNguyen nope และฉันใช้เวลามากในการพยายามใช้แคช npm เพื่อทำงาน ฉันแนะนำให้คุณใช้วิธีแก้ปัญหาของฉัน
Brian Ogden

สถานการณ์ของฉันแตกต่าง ทุกครั้งที่มีการสร้างทริกเกอร์ทาสจะได้รับการจัดสรรใน k8s ดังนั้นฉันไม่สามารถแคชตามกระบวนการสร้างนักเทียบท่า ฉันต้องการยึดแคช NPM เพื่อให้ฉันสามารถเมานต์ไดรฟ์ถาวรเป็นทาสทุกครั้งที่ได้รับการจัดสรร
An Nguyen

0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.