Bagaimana cara mengaktifkan cache npm di slave build Jenkins yang berjalan di docker?

13

Saya memiliki gambar Docker, sebut saja frontend.image, yang saya gunakan untuk Jenkins build slave. Plugin Jenkins Docker akan memutar wadah dari gambar ini dan membuat artefak di dalam wadah. Ini semua bekerja dengan baik. Dalam hal ini, frontend.imagedigunakan untuk membangun aplikasi AngularJs. Bagian dari membangun aplikasi Angular ini adalah untuk menginstal paket npm yang dibutuhkan oleh aplikasi.

Proses ini, instal npm, tampaknya memakan waktu lama, sepertinya 3 menit, npm selalu menginstal setiap paket setiap kali.

Jadi saya menambahkan volume untuk budak saya, ini adalah volume yang dipasang di host, plugin Docker akan menggunakan volume ini setiap kali menjalankan wadah frontend:

masukkan deskripsi gambar di sini

Pengguna yang menjalankan perintah npm installadalah jenkins. npm menyimpan cache yang dapat Anda temukan dengan perintah npm config get cacheoutput mana/home/jenkins/.npm

Itulah sebabnya saya memiliki volume host yang /slaves/volumes/tsl.frontend:/home/jenkinsdipasang ke slave kontainer web saya.

Saya membangun aplikasi Angular saya menggunakan proyek Jenkins, membangun tidak ada masalah, banyak paket npm diinstal. Jika ssh ke host Docker saya dan menjalankan cmd ls /slaves/volumes/tsl.frontendsaya melihat banyak paket npm. Ini berarti volume host host saya untuk slave berfungsi. masukkan deskripsi gambar di sini

Sekarang saya membangun proyek Jenkins lagi, npm menginstal setiap paket lagi, meskipun wadah penampung budak Docker menggunakan mount host volume. Saya bahkan dapat mengkonfirmasi dengan menampar ke dalam slave container dengan cmd docker exec -it <some_clever_random_container_id> bashlalu cmd su jenkinslalu cmd npm cache lsyang berisi daftar banyak paket npm yang di-cache. masukkan deskripsi gambar di sini

Jadi, bahkan dengan volume mount host saya, yang memiliki izin chmod 777dengan cara sehingga tidak ada masalah izin, saya tidak bisa npm installmenggunakan cache.

Dalam build Jenkins saya, yang memutar kontainer slave Docker, cmd pertama yang saya jalankan adalah npm cache lsdan banyak paket terdaftar, bukankah ini berarti volume host saya berfungsi seperti yang diharapkan dan indeks cache npm memiliki integritas alias tidak rusak?

masukkan deskripsi gambar di sini

Saya telah mencoba npm installcmd biasa , yang, ketika saya jalankan di mesin localhost saya menginstal semua paket pertama kali dan hampir tidak ada paket lain kali. Dan juga cache npm "hack" npm --cache-min 9999999 install, diambil dari jawaban SO ini serta cmdnpm --skip-installed --cache-min 9999999 install

Pertanyaan terkait telah diposting di StackOverflow.

Brian Ogden
sumber
Saya berani bertaruh indeks cache tidak disimpan dalam ~ / .npm sesuai dengan deskripsi Anda
Tensibai
@ Tensibai Anda salah dan saya sangat yakin tentang ini, pengguna adalah jenkins, karena itulah yang Anda katakan dengan cara lain, karena saya menjalankan npm cache ls sebagai pengguna jenkins dan yang mencantumkan paket, Anda mengatakan bahwa npm install adalah dieksekusi oleh pengguna lain
Brian Ogden
tidak, saya katakan indeks itu sendiri mungkin disimpan di tempat lain, di / usr / local atau apa pun jalur npm diinstal atau apa pun, saya tidak tahu. Ini hanya terdengar seperti npm bertindak seolah-olah tidak ada dalam cache, jadi saya kira itu tidak mencantumkan direktori tetapi mendasarkan dirinya pada beberapa jenis indeks di tempat lain.
Tensibai
@Tensibai tetapi konfigurasi cmd npm mendapatkan cache mengembalikan /home/jenkins.npm sebagai jalur itu bukankah menurut Anda yang mengkonfirmasi lokasi cache?
Brian Ogden
Lokasi cache ya, yang tidak menegakkan indeks cache berada di lokasi yang sama sekali. Saya akan menambahkan npm cache lsdan mentah ls ~/.npm/* -aldalam skrip build itu sendiri sebelum langkah build lainnya hanya untuk memastikan keadaan wadah saat memulai build.
Tensibai

Jawaban:

5

Saya akhirnya menyelesaikan ini dengan menggunakan caching layer gambar Docker untuk instalasi npm, mengikuti jawaban ini

Ini berarti saya memindahkan instalasi npm dari gambar slave Docker dan menjadi gambar frontend yang sebenarnya, berikut ini adalah file Docker terakhir saya yang benar-benar menyimpan cache instalasi npm di antara build jika paket.config tidak memiliki perubahan:

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"]
Brian Ogden
sumber
2
itu tidak menyelesaikan masalah Anda yang dijelaskan dalam pertanyaan. Ini hanyalah cara lain untuk melakukan cache. Apakah Anda tahu alasannya? @Brian
An Nguyen
@ AnNguyen tidak, dan saya menghabiskan banyak waktu mencoba untuk mendapatkan npm cache untuk bekerja. Saya sarankan Anda menggunakan solusi saya
Brian Ogden
situasiku berbeda. Setiap kali build dipicu, slave akan disediakan pada k8s. Jadi saya tidak bisa melakukan cache berdasarkan proses pembangunan buruh pelabuhan. Saya ingin mendasarkan pada cache NPM sehingga saya dapat me-mount volume yang persisten ke dalam slave setiap kali disediakan
An Nguyen
0

Pendekatan lain yang dapat Anda lakukan adalah menyiapkan server repositori nexus tempat Anda meng-host modul npm Anda dan mem-proksi yang eksternal. Itu tidak meningkatkan cache, tetapi karena sumber daya berada di dalam jaringan lokal Anda atau mungkin dalam kerumunan yang sama itu tidak perlu waktu lama.

Archimedes Trajano
sumber