linux - 调用未安装的例程时 Shell 脚本不会失败

标签 linux bash shell jenkins dockerfile

我有一个用于安装 Jenkins 插件的简单 shell 脚本:

installPlugin() {
    {...}
}

  for f in ${plugin_dir}/*.hpi ; do
    #without optionals
    deps=$( unzip -p ${f} META-INF/MANIFEST.MF | tr -d '\r' | sed -e ':a;N;$!ba;s/\n //g' | grep -e "^Plugin-Dependencies: " | awk '{ print $2 }' | tr ',' '\n' | grep -v "resolution:=optional" | tr '\n' ' ' )
    for plugin in $deps; do
      installPlugin "$plugin" 1 && changed=1
    done
  done

我像这样从 Dockerfile 调用这个脚本:

RUN JENKINS_HOME=$JENKINS_HOME \
    http_proxy=$http_proxy \
    https_proxy=$https_proxy \
    $JENKINS_HOME/install_plugin.sh \
    ace-editor:1.1 \

即使 unzip 例程未安装在 Dockerfile 中,当我运行 docker build 时,即使缺少 unzip,输出仍然是成功的。如果以下步骤失败,我希望构建失败:

deps=$( unzip -p ${f} META-INF/MANIFEST.MF | tr -d '\r' | sed -e ':a;N;$!ba;s/\n //g' | grep -e "^Plugin-Dependencies: " | awk '{ print $2 }' | tr ',' '\n' | grep -v "resolution:=optional" | tr '\n' ' ' )

非常感谢任何帮助!

脚本输出如下:

/var/jenkins/install_plugin.sh: line 62: unzip: command not found

 deps=

但是,即使该脚本失败,docker build 也不会失败:

Successfully built 54f5a5ec567d

最佳答案

我最后做了这样一张空支票:

 for f in ${plugin_dir}/*.hpi ; do

    manifestMf=$(unzip -p ${f} META-INF/MANIFEST.MF | tr -d '\r')
    if [ $manifestMf=="" ]; then
        echo "Invalid META-INF/MANIFEST inside $f"
        exit 1
    fi;

    #without optionals
    deps=$(echo $manifestMf | sed -e ':a;N;$!ba;s/\n //g' | grep -e "^Plugin-Dependencies: " | awk '{ print $2 }' | tr ',' '\n' | grep -v "resolution:=optional" | tr '\n' ' ' )
    # with optionals
    #deps=$( unzip -p ${f} META-INF/MANIFEST.MF | tr -d '\r' | sed -e ':a;N;$!ba;s/\n //g' | grep -e "^Plugin-Dependencies: " | awk '{ print $2 }' | tr ',' '\n' | tr '\n' ' ' )
    for plugin in $deps; do
      installPlugin "$plugin" 1 && changed=1
    done
  done
done

关于linux - 调用未安装的例程时 Shell 脚本不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56000655/

相关文章:

linux - Yocto for Nvidia Jetson 由于 GCC 7 失败 - 无法计算目标文件的后缀

c++ - 区分头文件和编译器/语言标准/os/glibc

linux - 在 linux 中使用 bash 脚本合并两个文本文件

linux - 使用 sed 替换特定字符串

bash - 检查进程是否正在运行,如果没有,使用 Cron 重新启动它

arrays - 数组中出现频率最高的元素 (bash 3.2)

c - 为什么 fopen() 或 open() 使用 errno 而不是只返回错误代码?

linux - 如何在 Linux 上从 .so 中继承 C++ 类?

bash - 带参数的shell脚本?

linux - 如何将我的命令参数解析为 bash 脚本