将 $BASH_ENV 设置为脚本会将脚本的全部内容输出到 Jenkins 控制台

问题描述 投票:0回答:1

我需要

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 docker jenkins nvm
1个回答
0
投票

我也有类似的要求。我不需要 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" 
                }
            }
        }   
    }
}

并且没有显示令人毛骨悚然的回声/日志

© www.soinside.com 2019 - 2024. All rights reserved.