2015-06-02 26 views
16

nhiệm vụ của tôi là thu thập chi tiết nút và liệt kê chúng ở định dạng xác thực. Tôi cần phải ghi dữ liệu vào một tệp và lưu nó dưới dạng tệp csv và đính kèm nó dưới dạng các tạo phẩm. Nhưng tôi không thể tạo ra một tập tin sử dụng các kịch bản hấp dẫn trong Jenkins sử dụng plugin "Execute Hệ thống Groovy" như xây dựng bướcTrong công việc jenkins, tạo tệp bằng cách sử dụng hệ thống groovy trong không gian làm việc hiện tại

import jenkins.model.Jenkins 
import hudson.model.User 
import hudson.security.Permission 
import hudson.EnvVars 

EnvVars envVars = build.getEnvironment(listener); 

filename = envVars.get('WORKSPACE') + "\\node_details.txt"; 
//filename = "${manager.build.workspace.remote}" + "\\node_details.txt" 
targetFile = new File(filename); 
println "attempting to create file: $targetFile" 

if (targetFile.createNewFile()) { 
    println "Successfully created file $targetFile" 
} else { 
    println "Failed to create file $targetFile" 
} 
print "Deleting ${targetFile.getAbsolutePath()} : " 
println targetFile.delete() 

Output thu được

attempting to create file: /home/jenkins/server-name/workspace/GET_NODE_DETAILS\node_details.txt 
FATAL: No such file or directory 
java.io.IOException: No such file or directory 
    at java.io.UnixFileSystem.createFileExclusively(Native Method) 
    at java.io.File.createNewFile(File.java:947) 
    at java_io_File$createNewFile.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) 
    at Script1.run(Script1.groovy:13) 
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:682) 
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:666) 
    at hudson.plugins.groovy.SystemGroovy.perform(SystemGroovy.java:81) 
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) 
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:772) 
    at hudson.model.Build$BuildExecution.build(Build.java:199) 
    at hudson.model.Build$BuildExecution.doRun(Build.java:160) 
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:535) 
    at hudson.model.Run.execute(Run.java:1732) 
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43) 
    at hudson.model.ResourceController.execute(ResourceController.java:88) 
    at hudson.model.Executor.run(Executor.java:234) 

Một thời gian tôi thấy mọi người sử dụng "quản lý "đối tượng, làm thế nào tôi có thể truy cập vào nó? Alos bất kỳ ý tưởng nào về cách hoàn thành nhiệm vụ?

Trả lời

31

Vấn đề hệ thống Groovy kịch bản luôn chạy trong nút Jenkins thạc sĩ, trong khi không gian làm việc là đường dẫn tập tin trong nút nô lệ Jenkins của bạn, mà không tồn tại trong tổng thể của bạn nút.

Bạn có thể xác minh bằng mã

theDir = new File(envVars.get('WORKSPACE')) 
println theDir.exists() 

Nó sẽ trở lại false

Nếu bạn không sử dụng nút nô lệ, nó sẽ trở lại true

Giải pháp Như chúng ta có thể không sử dụng bình thường File, chúng tôi phải sử dụng FilePathhttp://javadoc.jenkins-ci.org/hudson/FilePath.html

if(build.workspace.isRemote()) 
{ 
    channel = build.workspace.channel; 
    fp = new FilePath(channel, build.workspace.toString() + "/node_details.txt") 
} else { 
    fp = new FilePath(new File(build.workspace.toString() + "/node_details.txt")) 
} 

if(fp != null) 
{ 
    fp.write("test data", null); //writing to file 
} 

Sau đó, nó hoạt động trong cả hai trường hợp.

+4

Một phiên bản đơn giản hơn của việc tạo đối tượng 'fp':' fp = new FilePath (build.workspace, 'node_details.txt') '. Việc kiểm tra có điều kiện là không cần thiết vì nó sẽ trừu tượng ra chủ quá. – ceilfors

0

tôi nghi ngờ lỗi là do định dạng đường dẫn, bạn có thể thử bên dưới:

thay đổi

filename = envVars.get('WORKSPACE') + "\\node_details.txt"; 

để

filename = envVars.get('WORKSPACE') + "/node_details.txt"; 

Bởi vì khi tôi đã cố gắng trong máy chủ Jenkins địa phương của tôi, Tôi đã thực hiện thành công.

enter image description here

enter image description here

+0

tôi đã cố gắng định dạng slash khác nhau tôi vẫn nhận được java.io.IOException: Không có tập tin hoặc direc như vậy tory – bicepjai

+0

tôi có thể chạy từ thư mục nhà của jenkins nhưng không phải là không gian làm việc của công việc, tôi đang sử dụng tùy chọn hệ thống groovy. có thể đó là lý do tại sao? làm thế nào tôi có thể chạy trong không gian làm việc của công việc bằng cách sử dụng tùy chọn hệ thống groovy? trông giống như một thứ cần sửa – bicepjai

0

Trả lời bởi @Larry Cai bao gồm một phần để ghi tệp vào nút phụ từ Hệ thống Groovy Script (khi nó chạy trên Nút chính).

Phần tôi trả lời là "Một thời gian tôi thấy mọi người sử dụng" người quản lý "đối tượng, làm cách nào tôi có thể truy cập vào nó" Đây là đối tượng đã có sẵn trong Post Build Groovy Script để truy cập nhiều thứ như môi trường biến, Build Status, Xây dựng Tên hiển thị, vv

Quoted from https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin:.

"các kịch bản hấp dẫn có thể sử dụng người quản lý thay đổi, trong đó cung cấp các phương pháp khác nhau để trang trí xây dựng của bạn những phương pháp có thể được phân loại vào danh sách trắng phương pháp và phương pháp không thuộc danh sách trắng."

Để truy cập vào nó, chúng ta có thể trực tiếp gọi nó trong bài xây dựng kịch bản hấp dẫn. Ví dụ

manager.build.setDescription (" mô tả tùy chỉnh ") manager.addShortText (" thêm tin nhắn của bạn ở đây ") ..

Tất cả các phương pháp có sẵn trên các đối tượng quản lý được tài liệu ở đây

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin#GroovyPostbuildPlugin-Whitelistedmethods

Các vấn đề liên quan