Jenkins, Git, Windows and Line Feeds

1,509 views
Skip to first unread message

David Brossard

unread,
Mar 27, 2013, 2:24:25 PM3/27/13
to jenkins...@googlegroups.com
All,
This has been frustrating me for a while. I need to both build Windows code and publish Linux code during a single build. The only way I've been able to get this to build is to run completely on a Windows slave. If I try to run on a linux slave as well it always complains that MSBuild cannot be found. So I force it onto my windows slave and use GIT to check out the code, build with MSBuild, then push out to both Windows and Linux without error.
Now my issue is that the code pushed to my Linux box has been converted to Windows' CR/LF method so none of my executables work on Linux. Short of doing a dos2unix on every single file I push out, is there a way to fix this? I tried adding "*   text=binary" to my gitattributes but to no avail. I think it may be ignoring that attributes file because jgit is used instead of git?
Any and all help greatly appreciated.
Thanks

Mark Waite

unread,
Mar 27, 2013, 2:42:26 PM3/27/13
to jenkins...@googlegroups.com
Could you split your build into two parts, running the part which involves Linux components on a Linux machine, and the part which requires MSBuild (and Windows) on your Windows machine, with one of those jobs publishing its build results as an artifact which the next build takes and includes in the build?

The artifact should be transmitted in binary and would not require that you perform any line transformations.

Mark Waite



From: David Brossard <dbro...@gmail.com>
To: jenkins...@googlegroups.com
Sent: Wednesday, March 27, 2013 12:24 PM
Subject: Jenkins, Git, Windows and Line Feeds

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 


William Soula

unread,
Mar 27, 2013, 2:43:47 PM3/27/13
to jenkins...@googlegroups.com
I can't tell if you are talking about files created during the build or files checked out for the build but if it is files checked out for the build perhaps your git line endings are set wrong.  If the git repo is for windows and git then you need it set to use linux line endings.  Check out this page:

Will

From: jenkins...@googlegroups.com [jenkins...@googlegroups.com] on behalf of David Brossard [dbro...@gmail.com]
Sent: Wednesday, March 27, 2013 1:24 PM
To: jenkins...@googlegroups.com

Subject: Jenkins, Git, Windows and Line Feeds

David Brossard

unread,
Mar 27, 2013, 2:54:49 PM3/27/13
to jenkins...@googlegroups.com
I found an answer to my own question.

  • Set the Jenkins Slave service to run as a specific user on the local system.
  • login as that user and run in a command prompt "git config --global  core.autocrlf input"
  • Clear out the Jenkins workspace on that slave so it will do a full git clone again
"core.autocrlf input" means don't monkey with the EOL stuff. If it was checked in as Linux EOL or Windows EOL it will keep it that way.

Thanks

David Brossard

unread,
Mar 27, 2013, 3:06:55 PM3/27/13
to jenkins...@googlegroups.com
William, just saw your post. That is exactly what I had to figure out.

Mark, I would definitely like to have different steps in my build run on different machines, however I still haven't solved the problem that if I have an MSBuild step anywhere in my config, it tries to find that on my linux slaves as well and fails. If you have any links to instructions on making that work I would love to see them. That was my original plan before forcing the entire job onto the Windows slave.

Thanks

Kevin Fleming (BLOOMBERG/ 731 LEXIN)

unread,
Mar 27, 2013, 3:55:47 PM3/27/13
to jenkins...@googlegroups.com
You need to assign labels ('windows', 'linux', etc.) to your slaves and then indicate in your jobs what labels are required for that job to run.

----- Original Message -----
At: Mar 27 2013 15:07:36

William, just saw your post. That is exactly what I had to figure out.

Mark, I would definitely like to have different steps in my build run on
different machines, however I still haven't solved the problem that if I
have an MSBuild step anywhere in my config, it tries to find that on my
linux slaves as well and fails. If you have any links to instructions on
making that work I would love to see them. That was my original plan before
forcing the entire job onto the Windows slave.

Thanks

On Wednesday, March 27, 2013 11:54:49 AM UTC-7, David Brossard wrote:
>
> I found an answer to my own question.
>
>
> - Set the Jenkins Slave service to run as a specific user on the local
> system.
> - login as that user and run in a command prompt "git config --global
> core.autocrlf input"
> - Clear out the Jenkins workspace on that slave so it will do a full
> git clone again
>
> "core.autocrlf input" means don't monkey with the EOL stuff. If it was
> checked in as Linux EOL or Windows EOL it will keep it that way.
>
> Thanks
>
> On Wednesday, March 27, 2013 11:24:25 AM UTC-7, David Brossard wrote:
>>
>> All,
>> This has been frustrating me for a while. I need to both build Windows
>> code and publish Linux code during a single build. The only way I've been
>> able to get this to build is to run completely on a Windows slave. If I try
>> to run on a linux slave as well it always complains that MSBuild cannot be
>> found. So I force it onto my windows slave and use GIT to check out the
>> code, build with MSBuild, then push out to both Windows and Linux without
>> error.
>> Now my issue is that the code pushed to my Linux box has been converted
>> to Windows' CR/LF method so none of my executables work on Linux. Short of
>> doing a dos2unix on every single file I push out, is there a way to fix
>> this? I tried adding "* text=binary" to my gitattributes but to no avail.
>> I think it may be ignoring that attributes file because jgit is used
>> instead of git?
>> Any and all help greatly appreciated.
>> Thanks
>>
>

Mark Waite

unread,
Mar 27, 2013, 6:35:34 PM3/27/13
to jenkins...@googlegroups.com
You would need to configure two different build jobs, with a different set of build steps in each job.  

The Linux build job would be configured to never call MSBuild.  The Windows build job would be configured to never call the Linux specific portions of the build.  

If the Windows job is the first job, then the Linux build job would be configured to copy the artifacts from the Windows build job and include those artifacts in the final build result.  

If the Linux job is the first job, then the Windows job would be configured to copy the artifacts from the Linux job and include those artifacts in the final build result.

Mark Waite


From: David Brossard <dbro...@gmail.com>
To: jenkins...@googlegroups.com
Sent: Wednesday, March 27, 2013 1:06 PM
Subject: Re: Jenkins, Git, Windows and Line Feeds

--

David Brossard

unread,
Mar 27, 2013, 6:48:16 PM3/27/13
to jenkins...@googlegroups.com, Mark Waite
We are getting off topic so I will start another one if I need to continue, but when I tried something similar to what you say previously, the Linux build had no clue about the windows build artifacts and vice-versa since they were separate jobs in separate workspaces and on different servers.
Reply all
Reply to author
Forward
0 new messages