如何解决在jenkins管道中通过脚本运行liquibase更新
我正在尝试建立一个Jenkins管道,该管道将在将任何内容推送到master分支时运行liquibase更新。 Jenkins的liquibaseRunner插件存在安全风险,因此,我无法安装它并从中运行liquibase更新。
我的liquibase *文件(bash脚本)在我的存储库中的以下路径中
/repo/liquibase/liquibase/liquibase*
我已经设置了运行以下shell脚本的管道。注意:出于测试目的,我已将命令设置为liquibase --help
,但通常我想运行更新命令。
export PATH=$PATH:/var/lib/jenkins/workspace/repo/liquibase
export PATH=$PATH:/var/lib/jenkins/workspace/repo/liquibase/liquibase
export PATH=$PATH:/var/lib/jenkins/workspace/repo/liquibase/liquibase/liquibase
export PATH=$PATH:/var/lib/jenkins/workspace/repo/liquibase/liquibase/jre/bin
cd liquibase
ls -ltr
chmod 755 liquibase/liquibase
chmod 755 liquibase/jre/bin/java.exe
liquibase --help
liquibase --help
命令在git bash中的目录路径/ repo / liquibase中运行良好。但是,当我从詹金斯运行它时,出现以下错误。
/ var / lib / jenkins / workspace / Database_and_Repos / liquibase / liquibase / liquibase / jre / bin / java:没有这样的文件或目录 构建步骤“执行外壳”将构建标记为失败
我的liquibase文件如下所示,它是导致错误的文件的最后一行。
#!/usr/bin/env bash
if [ ! -n "${LIQUIBASE_HOME+x}" ]; then
# echo "LIQUIBASE_HOME is not set."
## resolve links - $0 may be a symlink
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
LIQUIBASE_HOME=`dirname "$PRG"`
# make it fully qualified
LIQUIBASE_HOME=`cd "$LIQUIBASE_HOME" && pwd`
# echo "Liquibase Home: $LIQUIBASE_HOME"
fi
# build classpath from all jars in lib
if [ -f /usr/bin/cygpath ]; then
CP=.
for i in "$LIQUIBASE_HOME"/liquibase*.jar; do
i=`cygpath --windows "$i"`
CP="$CP;$i"
done
for i in "$LIQUIBASE_HOME"/lib/*.jar; do
i=`cygpath --windows "$i"`
CP="$CP;$i"
done
else
if [[ $(uname) = MINGW* ]]; then
CP_SEPARATOR=";"
else
CP_SEPARATOR=":"
fi
CP=.
for i in "$LIQUIBASE_HOME"/liquibase*.jar; do
CP="$CP""$CP_SEPARATOR""$i"
done
CP="$CP""$CP_SEPARATOR""$LIQUIBASE_HOME/lib/"
for i in "$LIQUIBASE_HOME"/lib/*.jar; do
CP="$CP""$CP_SEPARATOR""$i"
done
fi
if [ -z "${JAVA_HOME}" ]; then
#JAVA_HOME not set,try to find a bundled version
if [ -d "${LIQUIBASE_HOME}/jre" ]; then
JAVA_HOME="$LIQUIBASE_HOME/jre"
elif [ -d "${LIQUIBASE_HOME}/.install4j/jre.bundle/Contents/Home" ]; then
JAVA_HOME="${LIQUIBASE_HOME}/.install4j/jre.bundle/Contents/Home"
fi
fi
if [ -z "${JAVA_HOME}" ]; then
JAVA_PATH="$(which java)"
if [ -z "${JAVA_PATH}" ]; then
echo "Cannot find java in your path. Install java or use the JAVA_HOME environment variable"
fi
else
#Use path in JAVA_HOME
JAVA_PATH="${JAVA_HOME}/bin/java"
fi
# add any JVM options here
JAVA_OPTS="${JAVA_OPTS-}"
"${JAVA_PATH}" -cp "$CP" $JAVA_OPTS liquibase.integration.commandline.Main ${1+"$@"}
有人在Jenkins中使用liquibase命令遇到此问题吗?我整天都在搜寻Google,但没有找到与这个确切问题类似的东西。在正确方向上的任何帮助都将非常有用。
解决方法
(我们正在更新Liquibase Runner插件。我们有一个发布版本,Jenkins团队正在针对其安全性问题进行审查。)
错误消息似乎表明您的变更日志中的“执行外壳”命令无法正常工作。也许该命令未安装,也许正在调用不在您的构建计算机上的脚本。
一种探索此方法的方法,可以在其之前添加“ Execute shell”命令的“ echo”。另外,我会将--logLeve = DEBUG传递给Liquibase以获得关于它试图运行的命令的更好的主意。
感谢您使用Liquibase和Jenkins!我下个月将在这里谈论它:https://www.cloudbees.com/devops-world/。
,您可以使用liquibase-maven-plugin并在管道中调用Maven阶段:
sh mvn resources:resources liquibase:update
对我来说,这是最好的决定。遵循official documentation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。