小编mko*_*bit的帖子

如何在Jenkins管道脚本中使用扩展选择参数插件?

扩展选择参数插件很棒,我在通过UI配置的作业中使用它https://wiki.jenkins-ci.org/display/JENKINS/Extended+Choice+Parameter+plugin

但是,我正努力让它在Jenkinsfile样式管道脚本中运行.由于Jenkins管道语法生成器创建了以下代码段,因此扩展选择参数插件似乎尚未与管道脚本完全兼容:

parameters([<object of type com.cwctravel.hudson.plugins.extended_choice_parameter.ExtendedChoiceParameterDefinition>])
Run Code Online (Sandbox Code Playgroud)

如果我手动创建参数,我会得到与https://issues.jenkins-ci.org/browse/JENKINS-32188中提到的相同的行为

org.kohsuke.stapler.NoStaplerConstructorException: There's no @DataBoundConstructor on any constructor of class 
Run Code Online (Sandbox Code Playgroud)

有没有人知道可以解决ExtendedChoiceParameterDefinition不使用问题的任何变通办法@DataBoundConstructor

  • 詹金斯2.19.2
  • 扩展选择参数插件0.75

jenkins extended-choice-parameter

23
推荐指数
3
解决办法
1万
查看次数

在声明式jenkins管道中 - 我可以动态设置代理标签吗?

有没有办法动态设置代理标签而不是普通字符串?

这项工作有两个阶段:

  1. 第一阶段 - 始终在"主"代理上运行.在这个阶段结束时,我将知道第二阶段应该运行哪个代理.
  2. 第二阶段 - 应该在第一阶段确定的代理上运行.

我的(不工作)尝试看起来像这样:

pipeline {
    agent { label 'master' }
    stages {
        stage('Stage1') {
            steps {
                script {
                    env.node_name = "my_node_label"
                }
                echo "node_name: ${env.node_name}"
            }
        }

        stage('Stage2') {
            agent { label "${env.node_name}" }
            steps {
                echo "node_name: ${env.node_name}"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个回声工作正常,打印"my_node_label".第二阶段无法在标记为"my_node_label"的代理上运行,控制台将打印:

没有标签为'null'的节点

也许它可以提供帮助 - 如果我只是在标签字段中添加"$ {env}",我可以看到这是一个java类,因为它打印:

没有标有'org.jenkinsci.plugins.workflow.cps.EnvActionImpl@79c0ce06'标签的节点

jenkins jenkins-declarative-pipeline

22
推荐指数
2
解决办法
3万
查看次数

Java中的烹饪单位

是否有任何开源库可用于表示烹饪单位,例如Java中的Teaspoon和tablepoon?

我只找到了JSR-275(https://jcp.org/en/jsr/detail?id=275),这很棒,但不了解烹饪单位.

java units-of-measurement

21
推荐指数
1
解决办法
1622
查看次数

如何将String绑定到Guice中的变量?

我是Guice的新手,这是一个天真的问题.我了解到我们可以通过以下方式将String绑定到特定值:

bind(String.class)
        .annotatedWith(Names.named("JDBC URL"))
        .toInstance("jdbc:mysql://localhost/pizza");
Run Code Online (Sandbox Code Playgroud)

但是如果我想将String绑定到任何可能的字符呢?

或者我认为可以这样描述:

如何用Guice替换"new SomeClass(String strParameter)"?

binding guice

21
推荐指数
2
解决办法
3万
查看次数

是否可以在循环中创建并行的Jenkins声明管道阶段?

我在项目中的不同子项目上有一个长期运行的Gradle任务列表.我想使用Jenkins声明性管道并行运行它们.

我希望这样的东西可能会起作用:

projects = [":a", ":b", ":c"]

pipeline {
    stage("Deploy"){
        parallel {
             for(project in projects){
               stage(project ) {
                   when {
                       expression {
                            someConditionalFunction(project)
                       }
                   }
                   steps {
                       sh "./gradlew ${project}:someLongrunningGradleTask"
                  }
                }   
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不用说,由于它是期待阶段而不是for,因此会产生编译错误.关于如何克服这个问题的任何想法?谢谢

jenkins jenkins-pipeline

21
推荐指数
2
解决办法
1万
查看次数

不可变类应该是最终的?

它在本文中说:

让一个类成为最终因为它是不可变的是这样做的一个很好的理由.

我对此感到有点困惑......我理解不变性是线程安全性和简单性的POV中的好东西,但似乎这些问题与可扩展性有些正交.那么,为什么不变性成为最终上课的一个很好的理由呢?

java oop final

20
推荐指数
4
解决办法
7962
查看次数

Groovy脚本和log4j

在这里和那里寻找一个log4j在Groovy脚本中记录到文件的工作示例.

没有明确的类(它只是一个脚本).没有grails.不要控制...要归档.

只是一个带有log4j的简单groovy脚本.

log4j最适合这个(groovy)还是其他日志库更好?

有人可以指出我的例子或演示如何做到这一点?我设法让它到控制台,但没有提交.

如果log4j配置也在config.groovy文件中会很好,因为我正在使用配置文件来处理其他事情.

UPDATE

感谢neversleepz的例子,我有以下工作:

config.groovy文件:

log4j {  

  appender.stdout = "org.apache.log4j.ConsoleAppender"    
  appender."stdout.layout"="org.apache.log4j.PatternLayout"    
  appender.scrlog = "org.apache.log4j.FileAppender"    
  appender."scrlog.layout"="org.apache.log4j.PatternLayout"
  appender."scrlog.layout.ConversionPattern"="%d %5p %c{1}:%L - %m%n"         
  appender."scrlog.file"="rootscript.log" 
  rootLogger = "debug,scrlog,stdout"         
}
Run Code Online (Sandbox Code Playgroud)

我的剧本:

import org.apache.log4j.*
import groovy.util.logging.*   

def config = new ConfigSlurper().parse(new File('config.groovy').toURL())        
PropertyConfigurator.configure(config.toProperties())

Logger log = Logger.getInstance(getClass())

// Need to set log level as described here: 
// http://groovy.329449.n5.nabble.com/log4j-annotation-not-working-td4368806.html
log.level = Level.INFO

// this will NOT print/write as the loglevel is info
log.debug 'Executing Script.'
// this will print
log.info 'Simple sample to …
Run Code Online (Sandbox Code Playgroud)

groovy logging

20
推荐指数
2
解决办法
3万
查看次数

使用Maven运行spock单元测试

在之前的项目中,我使用Spock测试框架对我的Java代码进行单元测试.我发现这非常有效,所以我试图将Spock测试添加到我当前的项目中,该项目使用Maven作为其构建工具(之前的项目使用了Gradle).虽然我可以让Maven编译我的Spock测试(使用groovy-eclipse-compiler),但我无法让Maven运行测试.

我做了一个简单的例子来演示我的2个文件的问题:

  • pom.xml
  • src/test/java/ASpec.groovy

内容pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my.group</groupId>
    <artifactId>my-artifact</artifactId>
    <version>0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
            <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.0.8</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>0.7-groovy-2.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>groovy-eclipse-compiler</compilerId>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-batch</artifactId>
                        <version>2.1.8-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

内容ASpec.groovy:

import spock.lang.Specification

class ASpec extends Specification {

    def "Test A"(){
        // Always fail
        expect: false …
Run Code Online (Sandbox Code Playgroud)

java groovy unit-testing maven spock

20
推荐指数
2
解决办法
2万
查看次数

Kubernetes NFS持久卷 - 同一卷上的多个声明?索赔陷入悬而未决?

使用案例:

我有一个可用的NFS目录,我想用它来保存多个部署和pod的数据.

我创建了一个PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: http://mynfs.com
    path: /server/mount/point
Run Code Online (Sandbox Code Playgroud)

我希望多个部署能够使用它PersistentVolume,所以我对所需内容的理解是我需要创建多个PersistentVolumeClaims,这些都将指向此PersistentVolume.

kind: PersistentVolumeClaim
apiVersion: v1
metaData:
  name: nfs-pvc-1
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Mi
Run Code Online (Sandbox Code Playgroud)

我相信这会创造一个50MB的索赔PersistentVolume.当我跑步时kubectl get pvc,我看到:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1   Bound      nfs-pv    10Gi        RWX           35s
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我看到10Gi容量,而不是50Mi.

当我然后更改PersistentVolumeClaim部署yaml以创建名为的PVC时,nfs-pvc-2我得到:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1 …
Run Code Online (Sandbox Code Playgroud)

nfs kubernetes persistent-volumes persistent-volume-claims

20
推荐指数
3
解决办法
1万
查看次数

如何跨阶段重用以前创建的工作区

我面临一个问题,我在我的管道中定义了两个阶段,这两个阶段都在同一个节点上运行,需要在同一个工作区中运行.

这些阶段中的第一阶段最初在我的主节点上运行,但是在定义的步骤结束时必须将一些文件解压缩到不同的节点上.

然后第二阶段只需继续我的主人,并依赖从第一阶段安装的一些模块.

这是我的管道,以更好地解释:

#!groovy
pipeline {
  agent { label 'master' }
  stages {
    stage('Build') { // 1. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
      steps {
        sh '''
          npm install
          bower install
          gulp set-staging-node-env
          gulp prepare-staging-files
          gulp webpack
        '''
        stash includes: 'dist/**/*', name: 'builtSources'
        stash includes: 'config/**/*', name: 'appConfig'
        node('Protractor') { // 2. Running on vnccentos7 in /var/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
          dir('/opt/foo/deploy/') {
            unstash 'builtSources'
            unstash 'appConfig'
          }
        }        
      }
    }
    stage('Unit Tests') {
      agent { label 'master' } // 3. Running on master …
Run Code Online (Sandbox Code Playgroud)

jenkins jenkins-pipeline

20
推荐指数
4
解决办法
2万
查看次数