Dockerで実行されるJenkinsビルドスレーブでnpmキャッシュを有効にする方法は?


13

frontend.imageJenkinsビルドスレーブに使用するDockerイメージがあります。Jenkins Dockerプラグインは、このイメージからコンテナーをスピンアップし、コンテナー内にアーティファクトを構築します。これはすべてうまくいきます。この場合、frontend.imageAngularJsアプリの構築に使用されます。このAngularアプリの構築の一部は、アプリに必要なnpmパッケージをインストールすることです。

このプロセス、npm installには時間がかかり、3分かかるようです。npmは常にすべてのパッケージを毎回インストールします。

そこで、スレーブ用のボリュームを追加しました。これはホストマウントボリュームです。Dockerプラグインは、フロントエンドコンテナーを実行するたびにこのボリュームを使用します。

ここに画像の説明を入力してください

コマンドを実行するユーザーnpm installjenkinsです。npmは、npm config get cache出力するコマンドで見つけることができるキャッシュを保持します/home/jenkins/.npm

その/slaves/volumes/tsl.frontend:/home/jenkinsため、Webコンテナのスレーブにホストボリュームをマウントしています。

Jenkinsプロジェクトを使用してAngularアプリをビルドします。問題なくビルドされ、多くのnpmパッケージがインストールされています。Dockerホストにsshしてcmd ls /slaves/volumes/tsl.frontendを実行すると、多くのnpmパッケージが表示されます。これは、スレーブのホストボリュームマウントが機能したことを意味します。 ここに画像の説明を入力してください

ここで、ジェンキンスプロジェクトをもう一度ビルドします。npmは、Dockerスレーブビルドコンテナがボリュームホストマウントを使用している場合でも、すべてのパッケージを再度インストールします。キャッシュされた多くのnpmパッケージを一覧表示するcmd docker exec -it <some_clever_random_container_id> bash、cmd su jenkins、cmd npm cache lsでスレーブコンテナーにバッシングすることでも確認できます。 ここに画像の説明を入力してください

そのため、ホストマウントボリュームにアクセス許可chmod 777があり、アクセス許可の問題がないnpm install場合でも、キャッシュを使用できません。

Dockerスレーブコンテナーを起動するJenkinsビルドで、最初に実行するcmdがnpm cache lsあり、多くのパッケージがリストされていますが、これはホストボリュームが期待どおりに機能し、npmキャッシュインデックスの整合性が壊れていないことを意味しませんか?

ここに画像の説明を入力してください

通常のnpm installcmd を試しました。ローカルマシンで実行すると、最初にすべてのパッケージがインストールされ、次回はほとんどパッケージがインストールされません。また、このSOの回答とcmd npm --cache-min 9999999 installから取得したnpm cache "hack"npm --skip-installed --cache-min 9999999 install

関連する質問がStackOverflowに投稿されました。


あなたの説明によると、キャッシュインデックスは〜/ .npm内に格納されていないと思います
-Tensibai

@Tensibaiあなたは間違っており、私はこれについて非常に確信しています、ユーザーはジェンキンスです、それはあなたが別の方法で言っていることです、なぜなら私はジェンキンスユーザーとしてnpm cache lsを実行し、パッケージをリストするので、あなたはnpm installが別のユーザーによって実行されている
ブライアンオグデン

いいえ、インデックス自体はおそらく他の場所、/ usr / local、またはnpmがインストールされているパスまたはその他のパスに格納されていると言っています。これは、npmがキャッシュに何もないかのように動作しているように聞こえるので、ディレクトリをリストせず、他の場所の何らかのインデックスに基づいていると思います。
テンシバイ

@Tensibaiしかし、cmd npm config get cacheはそのパスとして/home/jenkins.npmを返します。これはキャッシュの場所を確認していると思いませんか?
ブライアンオグデン

はい、キャッシュインデックスを強制しないキャッシュの場所はまったく同じ場所にあります。ビルドを開始するときにコンテナの状態を確認するためだけに、他のビルドステップの前にビルドスクリプト自体にnpm cache lsRAWとRAWを追加しls ~/.npm/* -alます。
テンシバイ

回答:


5

この答えに続いて、npmインストールにDockerイメージレイヤーキャッシングを使用して最終的にこれを解決しました

これは、npmインストールをDockerスレーブイメージから実際のフロントエンドイメージに移動したことを意味します。package.configに変更がない場合、ビルド間でnpmインストールを実際にキャッシュする最終的なDockerファイルを次に示します。

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
質問に記載されている問題は解決しません。これは単なるキャッシュの別の方法です。まだその理由を知っていますか?@ブライアン
グエン

@AnNguyenいや、私はnpmキャッシュを動作させるのにかなりの時間を費やしました。私のソリューションを使用することをお勧めします
ブライアンオグデン

私の状況は異なります。ビルドがトリガーされるたびに、k8でスレーブがプロビジョニングされます。したがって、Dockerビルドプロセスに基づいてキャッシュすることはできません。私は奴隷にそれがプロビジョニングだたびに永続的なボリュームをマウントすることができますので、私はNPMキャッシュ上のベースにしたい
アングエン

0

別の方法として、npmモジュールをホストし、外部モジュールをプロキシするnexusリポジトリサーバーをセットアップする方法があります。キャッシュは活用しませんが、リソースはローカルネットワーク内または同じ群れにあるため、それほど長くはかからないはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.