Rsync包含一个漂亮的选项--cvs-exclude
"以与CVS相同的方式忽略文件",但CVS已经过时多年.有没有办法让它也排除现代版本控制系统(Git,Mercurial,Subversion)会忽略的文件?
例如,我从GitHub检出了很多Maven项目.通常它们.gitignore
至少包括一个列表target
,默认的Maven构建目录(可能存在于顶层或子模块中).由于这些目录的内容完全是一次性的,并且它们可能远远大于源代码,因此我想在使用rsync进行备份时将它们排除在外.
当然我可以明确地--exclude=target/
但是会意外地抑制恰好被命名target
并且不应该被忽略的不相关目录.
我可以为我的磁盘上的任何.gitignore
,.hgignore
或svn:ignore
属性中提到的所有文件名和模式提供完整的绝对路径列表,但这将是一个巨大的列表,必须由某种脚本生成.
由于rsync没有内置支持除CVS之外的VCS检出,是否有任何好的技巧可以为它们提供忽略模式?或者某种回调系统,可以询问用户脚本是否应该包含给定的文件/目录?
更新:--filter=':- .gitignore'
正如LordJavac所建议的那样,Git和--filter=:C
CVS 一样好,至少在我发现的例子中,尽管不清楚语法是否完全匹配.--filter=':- .hgignore'
对Mercurial不起作用; 例如,rsync不能将.hgignore
包含类似^target$
(Git的Mercurial等价物/target/
)的行视为正则表达式.对于Subversion来说似乎没什么用,因为你需要.svn/dir-prop-base
为1.6或更早的工作副本解析,并且为1.7或更高版本的工作副本沮丧地举手.
如何parameters
在"工作流"Jenkins作业的"此构建参数化"部分中访问set?
测试用例
foo
具有默认值的STRING PARAMETER bar text
.将以下代码添加到Workflow Script
:
node()
{
print "DEBUG: parameter foo = ${env.foo}"
}
Run Code Online (Sandbox Code Playgroud)结果
DEBUG: parameter foo = null
在某些情况下,我想失败的构建.我怎么做?
我试过了:
throw RuntimeException("Build failed for some specific reason!")
Run Code Online (Sandbox Code Playgroud)
事实上这确实无法构建.但是,日志显示异常:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.RuntimeException java.lang.String
Run Code Online (Sandbox Code Playgroud)
这对用户来说有点混乱.有没有更好的办法?
我正在使用Jenkins v2.1和集成的交付管道功能(https://jenkins.io/solutions/pipeline/)来编排两个现有的构建(构建和部署).
在我的参数化构建中,我有3个用户参数设置,也需要在管道中进行选择.
管道脚本如下:
node: {
stage 'build'
build job: 'build', parameters: [[$class: 'StringParameterValue', name: 'target', value: target], [$class: 'ListSubversionTagsParameterValue', name: 'release', tag: release], [$class: 'BooleanParameterValue', name: 'update_composer', value: update_composer]]
stage 'deploy'
build job: 'deploy', parameters: [[$class: 'StringParameterValue', name: 'target', value: target]]
}
Run Code Online (Sandbox Code Playgroud)
这个工作正常,除了BooleanParameterValue
.当我构建管道时,抛出以下错误:
java.lang.ClassCastException: hudson.model.BooleanParameterValue.value expects boolean but received class java.lang.String
Run Code Online (Sandbox Code Playgroud)
如何解决此类型转换错误?或者甚至更好,是否有一种不那么麻烦的方式,我可以将所有管道参数传递给下游作业.
这是我正在玩的代码
node {
stage 'build'
echo 'build'
stage 'tests'
echo 'tests'
stage 'end-to-end-tests'
def e2e = build job:'end-to-end-tests', propagate: false
result = e2e.result
if (result.equals("SUCCESS")) {
stage 'deploy'
build 'deploy'
} else {
?????? I want to just fail this stage
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我将"端到端测试"阶段标记为失败,而不会使整个工作失败?传播假只是总是将舞台标记为真,这不是我想要的,但传播真实标志着失败的工作,我也不想要.
假设我们有以下内容Jenkinsfile
:
stage name: "Cool stage"
sh 'whoami'
stage name: "Better stage"
def current_stage = getCurrentStageName()
echo "CONGRATULATIONS, you are on stage: $current_stage"
Run Code Online (Sandbox Code Playgroud)
问题是如何实施getCurrentStageName()
.我知道,我可以使用构建运行时的访问权限currentBuild.rawBuild
.但是如何从这一点获得舞台名称?
我需要这个用于电子邮件通知中的一些自定义,以便我可以始终捕获失败的阶段名称并将其包含在电子邮件正文中.
假设我有一个#!/bin/sh
可以采用各种位置参数的脚本,其中一些可能包含空格,两种引号或两种引号等.我想迭代"$@"
并为每个参数立即以某种方式处理它,或者保存以供以后使用.在脚本结束时,我想启动(可能exec
)另一个进程,传递一些这些参数,所有特殊字符都保持不变.
如果我没有对参数进行处理,othercmd "$@"
那么工作正常,但我需要提取一些参数并稍微处理它们.
如果我可以假设Bash,那么我可以printf %q
用来计算我eval
以后可以引用的args的引用版本,但这不适用于例如Ubuntu的Dash(/bin/sh
).
是否printf %q
可以使用内置函数和POSIX定义的实用程序在简单的Bourne shell脚本中编写任何等效文件,比如说我可以复制到脚本中的函数?
例如,脚本以ls
相反的顺序尝试其参数:
#!/bin/sh
args=
for arg in "$@"
do
args="'$arg' $args"
done
eval "ls $args"
Run Code Online (Sandbox Code Playgroud)
适用于许多情况:
$ ./handle goodbye "cruel world"
ls: cannot access cruel world: No such file or directory
ls: cannot access goodbye: No such file or directory
Run Code Online (Sandbox Code Playgroud)
但不是在'
使用时:
$ ./handle goodbye "cruel'st world"
./handle: 1: eval: Syntax error: Unterminated quoted …
Run Code Online (Sandbox Code Playgroud) 在Jenkins中,我有两个不同的项目和两个我想要授权的用户:
User1只能查看,构建,部署Project1.
User2只能查看,构建,部署Project2.
我已经安装了基于角色的插件,但无法使其正常工作.请帮忙.
不确定这是我对Groovy的有限了解还是管道parallel
步骤中的怪癖.failFast
如果我使用map而不是单独传递每个闭包,我无法接受它:
def map = [:]
map['spam'] = {
node {
echo 'spam'
}
}
map['eggs'] = {
node {
echo 'eggs'
}
}
parallel map // Works.
parallel spam: map['spam'], eggs: map['eggs'], failFast: true // Works.
parallel map, failFast: true // Fails with exception.
Run Code Online (Sandbox Code Playgroud)
例外failFast
是:
java.lang.IllegalArgumentException: Expected named arguments but got [{failFast=true}, {spam=org.jenkinsci.plugins.workflow.cps.CpsClosure2@51a382ad, eggs=org.jenkinsci.plugins.workflow.cps.CpsClosure2@718cb50d}]
at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:276)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:111)
Run Code Online (Sandbox Code Playgroud) Jenkins Workflow插件的以下脚本:
def mapping = readFile 'a file'
mapping.eachLine {
def line = it.tokenize('|')
sh "${line[1]}"
}
Run Code Online (Sandbox Code Playgroud)
需要脚本批准:
staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods tokenize java.lang.String java.lang.String
staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods eachLine java.lang.String java.lang.String
Run Code Online (Sandbox Code Playgroud)
为了使脚本成功运行,必须尝试构建,必须授予手动批准,然后必须再次尝试另一个构建,依此类推.
对于大型脚本,保持白名单方法是一个相当繁琐的过程.
是否有一些groovy方法的子集不需要脚本批准和/或白名单?