[英]Running liquibase update from script in jenkins pipeline
我正在尝试设置一个 Jenkins 管道,只要有东西被推送到主分支,它就会运行 liquibase 更新。 Jenkins 的 liquibase runner 插件存在安全风险,因此我无法安装它并从中运行 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 运行正常。但是,当我从 Jenkins 运行它时,出现以下错误。
/var/lib/jenkins/workspace/Database_and_Repos/liquibase/liquibase/liquibase/jre/bin/java: No such file or directory Build step 'Execute shell' marked build as failure
我的 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 命令遇到过这个问题? 我整天都在谷歌搜索,但没有发现与这个确切问题有太多相似之处。 在正确方向上的任何帮助都会很棒。
(我们正在更新 Liquibase Runner 插件。我们有一个正在由 Jenkins 团队审查安全问题的版本。)
错误消息似乎表明您的更改日志中的“执行 shell”命令无法正常工作。 也许该命令未安装,也许它正在调用不在您的构建机器上的脚本。
探索这个的一种方法是在之前添加“执行 shell”命令的“回显”。 此外,我会将 --logLeve=DEBUG 传递给 Liquibase 以更好地了解它试图运行的命令。
感谢您使用 Liquibase 和 Jenkins:下个月我会在这里谈论它: https://www.cloudbees.com/devops-world/ 。
您可以使用liquibase-maven-plugin并在管道中调用 maven 阶段:
sh mvn resources:resources liquibase:update
对我来说,这是最好的决定。 按照 官方文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.