繁体   English   中英

从 jenkins 管道中的脚本运行 liquibase 更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM