Add cross-platform build pipeline examples.#54
Add cross-platform build pipeline examples.#54BillHoo wants to merge 5 commits intojenkinsci:masterfrom
Conversation
I'm using Jenkins pipeline plugin for my cross-platform libraries build. But at the beginning, I find its hard to write a cross-platform pipeline script, there's no such a example in official site. So I made my own and wish it can help others.
I'm using Jenkins pipeline plugin for my cross-platform libraries build. But at the beginning, I find its hard to write a pipeline script for cross-platform build, there's no such a example in official site. So I made my own and wish it can help others.
orrc
left a comment
There was a problem hiding this comment.
Running the build, archive, and cleanup commands in separate blocks doesn't seem reliable — there may be multiple nodes with the same label, and I don't believe it's guaranteed that you'll always get the same workspace between the stages being executed.
| // -- ios | ||
| // -- macos | ||
| // --symbols | ||
| // -- win32 (Dir to hold PDB symbols generate from CMake) |
There was a problem hiding this comment.
Typically, information like this should go into a README in the root of this directory.
|
|
||
| // Stash all source files for another platform usage. | ||
| // NOTE: the stashed file's scope is in node 'master', so we can unstash it later. | ||
| stash name: 'YOUR_CROSSPLATFORM_SOURCES' |
There was a problem hiding this comment.
In general, I don't think it's a good idea to stash the entire workspace — but in this case if your full checkout takes less than 10 seconds, it might be ok.
But after the initial checkout, I imagine it should be faster to allow each parallel branch to update its clone, rather than stashing and unstashing the entire workspace at the start of every build.
There was a problem hiding this comment.
For 'stash/unstash' topic:
In real uasge, I'm excluding much files than stashing whole worksapce, only source code was stashed, and Jenkins was setup on the same server which host my SVN, so checkout to a local workspace is fast enough for small and medium-sized project. And for this example, I removed 'exclude' session to simplify the syntax. Should we add 'exclude' back?
For 'checkout' topic:
This is a little complex, at the beginning, I'm following Jenkins guide to checkout(update clone after initial checkout) project on each platform, it works fine before I meet these two main problems:
- Checkout/Update on each OS made me copy at least four times(Linux/Win32/MacOS/iOS) of the same 'checkout' code in the Jenkinsfile, it doesn't smells good to me.
- According to the 1st reason, I'm wondering if there's any solution to avoid that copy, and I find that only 'stash/ubstash' works, but the drawback is the unstashed files is out of version control, so I need cleanup whole agent workspace after every build.
Currently the 'stash/unstash' solution works fine to me, but I'm still searching for a better one. Is there's any official examples or guidelines for cross-platform build pipleline template? Or I'll keep to make my branch better for general cross-platform usage. :)
| "win32-stream" : { | ||
| node('win32') { | ||
| // This will copy all files packaged in YOUR_CROSSPLATFORM_SOURCES to agent workspace root directory. | ||
| // To copy to another agent directory, see [https://github.com/BillHoo/pipeline-examples/tree/master/pipeline-examples/unstash-different-dir] |
There was a problem hiding this comment.
The URL should point to https://github.com/jenkinsci/pipeline-examples
There was a problem hiding this comment.
Oops, the URL was a mistake, I'll fix it later.
| "win32-archiving" : { | ||
| node('win32') { | ||
| step([$class: 'ArtifactArchiver', artifacts: 'dist\\win32\\*', fingerprint: true]) | ||
| step([$class: 'ArtifactArchiver', artifacts: 'symbols\\win32\\*', fingerprint: true]) |
There was a problem hiding this comment.
This verbose syntax is no longer required; archiveArtifacts artifacts: '**/foo.bar', fingerprint: true should be sufficient.
There was a problem hiding this comment.
Deal, this will be fixed later.
| // Final cleanup | ||
| // Why we need this cleaup? | ||
| // stash/unstash command just copy files from source to dest without any version control stuff like Git/SVN did. | ||
| // So all files will stay in agent workspace if we dont't remove it, and may cause issues when we launch next build. |
There was a problem hiding this comment.
Related to above: I'd just use git clean (if using Git) :)
|
Hi @orrc , thanks for reviewing, I'm struggling to write a well-performed pipeline for my cross-platform library project, and I appreciate for any advises which can make it better.
For this, I have three agent node named as 'win32' 'ios' and 'android', how could it be unreliable?
I'm not got your point, what did you mean I can't get the same workspace? And if it do happen, how can it defeat my project build? Could you please expalin it in detail? |
|
This script isn't using labels at all, it's directly adressing nodes. So that shouldn't be a problem. Unfortunatly I'm currently searching for a solution how to build across multiple platforms with multiple nodes tagged by labels. |
|
win32/android etc. are the lables indeed, and I've use it for years, maybe I should update the script I use for now cus' its already changed a lot. |
|
Hrm, well then that's just not listed in the official docs. https://jenkins.io/doc/book/pipeline/syntax/ |
I'm using Jenkins pipeline plugin for my cross-platform libraries build. But at the beginning, I find its hard to write a cross-platform pipeline script, there's no such a example in official site. So I made my own and wish it can help others.