我需要
nvm
在作为 Jenkins 代理运行的 Docker 容器中运行。通过将 $BASH_ENV
设置为 $NVM_DIR/nvm.sh
,我能够让 nvm 在这种情况下工作。
这达到了预期的结果,因为
nvm
将在我的 Jenkins 管道中工作,但有一个奇怪的副作用,即每次都将 nvm.sh
的全部内容输出到 Jenkins 控制台我启动一个 sh
Jenkinsfile 中的块,如下所示:
10:50:31 [Pipeline] sh
10:50:32 + NVM_SCRIPT_SOURCE=/bin/bash
10:50:32 + '[' -z '' ']'
10:50:32 + export NVM_CD_FLAGS=
10:50:32 + NVM_CD_FLAGS=
10:50:32 + nvm_is_zsh
10:50:32 + '[' -n '' ']'
10:50:32 + '[' -z /home/jenkins/.nvm ']'
10:50:32 + case $NVM_DIR in
10:50:32 + unset NVM_SCRIPT_SOURCE
10:50:32 + nvm_process_parameters
10:50:32 + local NVM_AUTO_MODE
10:50:32 + NVM_AUTO_MODE=use
10:50:32 + '[' 0 -ne 0 ']'
clipped for brevity...
如果我使用另一个
sh
块,则会再次输出,这是一种非常奇怪的效果,在任何其他上下文中都不会发生(例如,在 Jenkins 之外单独运行 Docker 容器),使用 set +x
无效。
我相当确定这与使用
$BASH_ENV
有关,这是我设法让 nvm
在我需要的所有上下文中工作而无需每次手动获取它的唯一方法。
Dockerfile:
FROM ubuntu:22.04
USER root
# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# Set debconf to run non-interactively
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
WORKDIR /home/jenkins
USER jenkins
RUN tfenv install && tfenv use
# Create needed directories and environment variables to allow non-interactive running
ENV NVM_DIR /home/jenkins/.nvm
RUN mkdir -p $NVM_DIR
# nvm will stop working in Jenkins if this is removed
ENV BASH_ENV $NVM_DIR/nvm.sh
ENV NODE_VERSION 20.5.1
# - Install nvm and node (also includes npm)
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash \
&& . $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm alias default $NODE_VERSION \
&& nvm use default
ENV NODE_PATH $NVM_DIR/versions/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/v$NODE_VERSION/bin:$PATH
CMD ["/bin/bash"]
示例 Jenkins 文件:
pipeline{
stages {
stage ('Stage 1') {
steps {
script {
sh "echo hello" # nvm.sh contents output here...
sh "echo world" # ... and again here
}
}
}
}
}
有什么方法可以抑制此输出并阻止它弄乱我的日志吗?
我也有类似的要求。我不需要 BASH_ENV。这个 Dockerfile 在 jenkins 中安装 nvm
FROM jenkins/jenkins:lts
USER root
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION v16.17.0
RUN mkdir -p /usr/local/nvm && apt-get update && echo "y" | apt-get install curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"
ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/bin
ENV PATH $NODE_PATH:$PATH
USER jenkins
然后在jenkins容器内,nvm就可以使用了
我还尝试了你的管道(修复它)
pipeline{
agent any
stages {
stage ('Stage 1') {
steps {
script {
sh "echo hello"
sh "echo world"
}
}
}
}
}
并且没有显示令人毛骨悚然的回声/日志