Làm cách nào để bật bộ đệm npm trong nô lệ xây dựng Jenkins chạy trong docker?


13

Tôi có một hình ảnh Docker, hãy gọi nó frontend.image, mà tôi sử dụng cho một nô lệ xây dựng Jenkins. Plugin Jenkins Docker sẽ quay một container từ hình ảnh này và xây dựng các tạo phẩm bên trong container. Tất cả điều này làm việc tuyệt vời. Trong trường hợp này, ứng frontend.imagedụng được sử dụng để xây dựng ứng dụng AngularJs. Một phần của việc xây dựng ứng dụng Angular này là cài đặt các gói npm mà ứng dụng yêu cầu.

Quá trình này, cài đặt npm, dường như mất nhiều thời gian, dường như 3 phút, npm luôn cài đặt mọi gói mỗi lần.

Vì vậy, tôi đã thêm một ổ đĩa cho nô lệ của mình, nó là ổ đĩa được gắn trên máy chủ, plugin Docker sẽ sử dụng ổ đĩa này mỗi khi nó chạy bộ chứa frontend:

nhập mô tả hình ảnh ở đây

Người dùng thực thi lệnh npm installjenkins. npm giữ một bộ đệm mà bạn có thể tìm thấy bằng lệnh npm config get cachexuất ra/home/jenkins/.npm

Đó là lý do tại sao tôi có khối lượng máy chủ /slaves/volumes/tsl.frontend:/home/jenkinsđược gắn vào nô lệ bộ chứa web của mình.

Tôi xây dựng ứng dụng Angular của mình bằng dự án Jenkins, xây dựng không có vấn đề gì, nhiều gói npm được cài đặt. Nếu ssh vào máy chủ Docker của tôi và chạy cmd, ls /slaves/volumes/tsl.frontendtôi thấy rất nhiều gói npm. Điều này có nghĩa là khối lượng máy chủ lưu trữ của tôi cho nô lệ làm việc. nhập mô tả hình ảnh ở đây

Bây giờ tôi xây dựng lại dự án Jenkins, npm cài đặt lại từng gói một lần nữa, mặc dù bộ chứa bản dựng nô lệ Docker đang sử dụng giá đỡ máy chủ khối lượng. Tôi thậm chí có thể xác nhận bằng cách bash vào container nô lệ với cmd docker exec -it <some_clever_random_container_id> bashrồi cmd su jenkinsrồi cmd npm cache lsliệt kê nhiều gói npm được lưu trữ. nhập mô tả hình ảnh ở đây

Vì vậy, ngay cả với khối lượng gắn kết máy chủ của tôi, có quyền truy cập chmod 777bằng cách này để không có vấn đề về quyền, tôi không thể npm installsử dụng bộ đệm.

Trong bản dựng Jenkins của tôi, tạo ra thùng chứa nô lệ Docker, cmd đầu tiên tôi chạy là npm cache lsvà nhiều gói được liệt kê, điều này không có nghĩa là khối lượng máy chủ của tôi hoạt động như mong đợi và chỉ số bộ đệm npm có toàn vẹn hay không bị hỏng?

nhập mô tả hình ảnh ở đây

Tôi đã thử npm installcmd thông thường , khi tôi chạy trên máy localhost của tôi sẽ cài đặt tất cả các gói lần đầu tiên và gần như không có gói nào vào lần tiếp theo. Và cũng là "hack" npm cache npm --cache-min 9999999 install, được lấy từ câu trả lời SO này cũng như cmdnpm --skip-installed --cache-min 9999999 install

Một câu hỏi liên quan đã được đăng trên StackOverflow.


Tôi cá là chỉ số bộ đệm không được lưu trong vòng ~ / .npm theo mô tả của bạn
Tensibai

@Tensibai bạn không chính xác và tôi rất chắc chắn về điều này, người dùng là jenkins, vì đó là những gì bạn đang nói theo cách khác, vì tôi chạy npm cache ls với tư cách là người dùng jenkins và liệt kê các gói, bạn đang nói rằng cài đặt npm là được thực thi bởi một người dùng khác
Brian Ogden

không, tôi đang nói rằng chính chỉ mục có thể được lưu trữ ở nơi khác, trong / usr / local hoặc bất kỳ đường dẫn nào npm được cài đặt trong hoặc whatelse, tôi không biết. Điều này nghe có vẻ như npm đang hoạt động như thể không có gì trong bộ đệm, vì vậy tôi đoán nó không liệt kê thư mục mà chỉ dựa vào một số loại chỉ mục ở nơi khác.
Tensibai

@Tensibai nhưng cấu hình cmd npm nhận bộ đệm trả về /home/jenkins.npm vì đường dẫn đó bạn không nghĩ rằng xác nhận vị trí của bộ đệm?
Brian Ogden

Vị trí của bộ đệm có, không thực thi chỉ mục bộ đệm ở cùng một vị trí. Tôi sẽ thêm một npm cache lsvà một nguyên ls ~/.npm/* -altrong tập lệnh xây dựng trước bất kỳ bước xây dựng nào khác chỉ để đảm bảo trạng thái của bộ chứa khi bắt đầu xây dựng.
Tensibai

Câu trả lời:


5

Cuối cùng tôi đã giải quyết điều này bằng cách sử dụng bộ nhớ đệm lớp hình ảnh Docker cho cài đặt npm, theo câu trả lời này

Điều này có nghĩa là tôi đã chuyển cài đặt npm ra khỏi hình ảnh nô lệ Docker và vào hình ảnh thực sự ở lối vào, đây là tệp Docker cuối cùng của tôi thực sự lưu trữ cài đặt npm ở giữa các bản dựng nếu pack.config không có thay đổi:

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
nó không giải quyết vấn đề của bạn đã được mô tả trong các câu hỏi. Đó chỉ là một cách khác để lưu trữ. Bạn có biết lý do chưa? @Brian
An Nguyễn

@AnNguyen không, và tôi đã dành rất nhiều thời gian để cố gắng để bộ nhớ cache npm hoạt động. Tôi đề nghị bạn sử dụng giải pháp của tôi
Brian Ogden

tình hình của tôi thì khác Mỗi khi bản dựng được kích hoạt, một nô lệ sẽ được cung cấp trên k8s. Vì vậy, tôi không thể lưu trữ dựa trên quá trình xây dựng docker. Tôi muốn dựa trên bộ đệm NPM để tôi có thể gắn một khối lượng liên tục vào nô lệ mỗi khi nó được cung cấp
An Nguyen

0

Một cách tiếp cận khác bạn có thể làm là thiết lập một máy chủ kho lưu trữ nexus nơi bạn lưu trữ các mô-đun npm của mình và ủy quyền các mô-đun bên ngoài. Nó không tận dụng bộ đệm, nhưng vì các tài nguyên nằm trong mạng cục bộ của bạn hoặc có thể trong cùng một bầy nên không mất nhiều thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.