由于令牌识别错误,Jenkins 下运行的脚本失败

由于令牌识别错误,Jenkins 下运行的脚本失败

我正在 Jenkins CI/CD 软件中创建一个构建作业。构建作业将从 Github 克隆我的 android 项目并生成 APK。我正在使用 Ubuntu 20.04 LTS 服务器操作系统。

作为构建步骤的一部分,我通过 Jenkins 执行以下命令:

rm -r app/src/main/java/in/myproj/utils/Constants.kt

但收到以下错误:

/tmp/jenkins10737829520192897047.sh: 1: Syntax error: "in" unexpected

看起来 bash 将文件夹名称in视为Constant.从今天早上开始,我一直在尝试寻找解决方案,但惨遭失败。任何帮助是极大的赞赏。

编辑:

我进一步调试了该问题并找到了实际原因。这不是rm命令失败。我还有另一个构建步骤,将一些代码片段附加到文件中。以下是实际失败的代码片段:

cat << EOT >> app/src/main/java/in/myproj/utils/Constants.kt

"package `in`.myproj.utils

class Constants {
    companion object {
        const val BASE_URL = "https://api.example.in/api/"
        const val BASE_URL_IMAGE_ADDRESS = "https://dashboard.example.in:5555/"
        const val BASE_URL_PROFILE_IMAGE_ADDRESS = "https://api.example.in/"
        const val ABOUT_US_URL = "https://example.in/aboutus.html"
        const val PRIVACY_POLICY_URL = "https://example.in/privacy-policy.html"
        const val TERMS_AND_CONDITIONS_URL = "https://example.in/terms-condition.html"
        const val REQUEST_TIMEOUT_DURATION = 10
        const val STATUS_SUCCESS = 1

答案1

问题在于您如何使用 EOT。当使用未引用的word 作为定界符分隔符,定界符的内容将在写入之前由 shell 扩展。正如中所解释的bash手册:

如果引用了 word 的任何部分,则分隔符是对 word 删除引号的结果,并且此处文档中的行不会扩展。如果word不加引号,则here-document的所有行都会进行参数扩展、命令替换和算术扩展,字符序列\newline被忽略,并且必须使用'\'来引用字符'\'、'$ ”和“”。

因此,`in`shell 正在将heredoc 中的 读取为命令替换,因此它尝试运行该命令in并返回其输出。

实际上,这意味着您需要引用EOT

cat << 'EOT' >> app/src/main/java/in/myproj/utils/Constants.kt

请注意,这意味着您在此处文档中可能拥有的任何变量也不会被扩展,但由于我在您的问题中没有看到任何变量,所以我假设这不是问题。

相关内容