Jump to content
Rob Calhoun

Collecting stdout from LabVIEW when run from Jenkins

Recommended Posts

Hi LAVA-ers,

I'm finally implementing a long-delayed transition from our homebrew LabView build system to Jenkins.

The best build-step option (for Jenkins under Windows) seems to be "Execute Windows batch command". My batch command looks like this:

pushd "directory-containing-lvproj"
echo "Running LabVIEW build process..."
start "bogustitle" /wait "C:\Program Files\National Instruments\LabVIEW 2017\LabVIEW.exe" "Build.lvproj" "BuildJenkinsProject.vi"
echo "complete, errorlevel %ERRORLEVEL%"
popd

where BuildJenkinsProject.vi is set to run when opened. BuildJenkinsProject.vi reads some environment variables set by Jenkins, sets up the builds (multiple EXEs and installers defined in a different lvproj) builds away.

But my builds take a while, and I'd like to see the output from my logging system inside Jenkins while the build is in progress. Some Googling turned up these posts re: sending output to stdout from LabVIEW:

https://lavag.org/topic/13486-printing-to-the-standard-output/

https://lavag.org/topic/11719-running-a-labview-exe-from-the-console/

I'm running LV 2017 64-bit, and none of the existing examples were handling 64-bit HANDLEs correctly, so I wrote a new version. This version uses only WinAPI calls (vs WinAPI + .NET), fixes some bugs, and it stateless, so you can call it anywhere in your code. Even when flushing the buffer after every write (which some on the Internet claim is necessary to get real-time log output; I am skeptical) it is plenty fast, around 10,000 lines per second. Since jdunham had previous written a fancy object-oriented logging system, I subclassed our logging system to write to stdout as well as the regular log. When I build from cmd.exe using the above batch file, it all works as intended.

My problem: when Jenkins runs my batch file, I get something rather less exciting: nothing!

E:\Jenkins\workspace>labview\Build\BuildJenkinsProject.bat
E:\Jenkins\workspace>pushd "labview\Source\Build\" 
E:\Jenkins\workspace\labview\Source\Build>echo "Running LabVIEW build process..." 
"Running LabVIEW build process..."
E:\Jenkins\workspace\labview\Source\Build>start "bogustitle" /wait "C:\Program Files\National Instruments\LabVIEW 2017\LabVIEW.exe" "Build.lvproj" "BuildJenkinsProject.vi" 
E:\Jenkins\workspace\labview\Source\Build>echo "complete, errorlevel 0" 
"complete, errorlevel 0"

Not a big deal since I have my regular log files, but having gotten this far it would be nice for Jenkins to show work-in-progress. Any ideas? In the meantime, here is a stdout writer. (Released under MIT License, copy away.)

-Rob Calhoun

WinAPI Write to StdOut.png

Attached: stdout writer function for LabVIEW 2017, and save-as-previous to LabVIEW 2012.

WinAPI Write to StdOut Folder.zip

 

Edited by Rob Calhoun
remove giant black bar
  • Like 1

Share this post


Link to post
Share on other sites
On 11/21/2017 at 10:23 PM, Rob Calhoun said:

My problem: when Jenkins runs my batch file, I get something rather less exciting: nothing!

Maybe Jenkins reads StdErr instead of StdOut. Try to change the argument of DuplicateHandle() to StdErr (-12). Just a guess, I didn't try that myself.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.