Jenkins: build job regardless revision - jenkins

I use GitHub as CSV. I want my Jenkins job to be built each time I trigger it regardless revision.
Unfortunately, if there are no any new pushes my job refuses to build:
[poll] Latest remote head revision on
refs/heads/My_Brench is:
f405ced00e0e64ece71658a1b179ef4ed0db2deb - already built by 13.
Job status: [My Job] subjob has no changes since last build. Using strategy:
Default
How can I avoid this skipping already built by 13 and build it anyway?

It seems that you're using https://wiki.jenkins-ci.org/display/JENKINS/Multijob+Plugin
With that plugin you can define boolean parameter hudson.scm.multijob.build.always in your parent job and if the value of this parameter is true all your sub-projects will be built regardless of SCM changes.

Related

jenkins trying to copyArtifacts from a build that I trigger

I have installed the copyArtifacts plugin and created two freestyle jobs: experiment-main and experiment-1
experiment-1 just creates a file called artifact.txt with the build # in it, and archives it.
experiment-main triggers experiment-1 and then tries to copy the artifact like this:
but this is the result:
Running as SYSTEM
Building on master in workspace /var/lib/jenkins/workspace/experiment-main
Waiting for the completion of experiment-1
experiment-1 #4 started.
experiment-1 #4 completed. Result was SUCCESS
Build step 'Trigger/call builds on other projects' changed build result to SUCCESS
ERROR: Unable to find a build for artifact copy from: experiment-1
Finished: FAILURE
which isn't what I expected (or at least what I was hoping for)
I hoped it would find the experiment-1 build that was downstream from the current build.
Any ideas?
I figured out that there are variables with the numbers of triggered builds that I can use. To figure out the variable, I just printed all the environment variables with env and then found the right variable in the list.
Then I configured the copy artifacts plugin to use that build number.
I couldn't do it how #alex-o suggested, just getting the last build of the subjob, because I might have more than one job using the subjob at once, but if you don't have that problem, that might work for you.
Yes, this is unexpected behavior indeed.
The reason why this won't work is hidden in the help text of the "Upstream Project Name" input field:
Downstream builds are found using fingerprints of files. That is, a build that is triggered from a build isn't always considered downstream, but you need to fingerprint files used in builds to let Jenkins track them.
So, the Copy-Artifact plugin relies on fingerprint data to determine job ancestry. For that reason, you can not use the "Downstream build of..." feature using the current job as a parent: fingerprints are recorded in a post-build step, so an ongoing build of example-master does not have any fingerprints associated to it by the time it is looking for a matching build of experiment-1.
It is possible to modify fingerprint information at build run-time (e.g., via Groovy), but then, it's probably best to avoid the Copy-Artifact plugin entirely and to implement the whole procedure in Groovy right away.
Your best bet is probably to refer to example-1 via "Last successful build" and to ensure that this is the build that you triggered before (usually this will be correct, but depending on your setup there can be race conditions).

Jenkins CHANGES_SINCE_LAST_SUCCESS plugin variable is empty

I have installed the Changes Since Last Success Plugin for Jenkins jobs. Inside the Build step of a Jenkins job I am trying to echo the value of the CHANGES_SINCE_LAST_SUCCESS variable. Unfortunately there is no value for this variable. I echo this value into a file inside my job's workspace.
You need Email-ext plugin instead.
Changes Since Last Success plugin has nothing to do with the CHANGES_SINCE_LAST_SUCCESS variable.
https://wiki.jenkins.io/display/JENKINS/Changes+Since+Last+Success+Plugin
This plugin adds a build action to aggregate changes from all previous builds to the last successful one. The primary goal is to generate a changelog to be used for continuous delivery, as an aggregate for all changes since the last deployable artifact.
Additionally, this plugin can be used to generate a changelog for an arbitrary range of builds:...

Jenkins: how to trigger pipeline on git tag

We want to use Jenkins to generate releases/deployments on specific project milestones. Is it possible to trigger a Jenkins Pipeline (defined in a Jenkinsfile or Groovy script) when a tag is pushed to a Git repository?
We host a private Gitlab server, so Github solutions are not applicable to our case.
This is currently something that is sorely lacking in the pipeline / multibranch workflow. See a ticket around this here: https://issues.jenkins-ci.org/browse/JENKINS-34395
If you're not opposed to using release branches instead of tags, you might find that to be easier. For example, if you decided that all branches that start with release- are to be treated as "release branches", you can go...
if( env.BRANCH_NAME.startsWith("release-") ) {
// groovy code on release goes here
}
And if you need to use the name that comes after release-, such as release-10.1 turning into 10.1, just create a variable like so...
if( env.BRANCH_NAME.startsWith("release-") ) {
def releaseName = env.BRANCH_NAME.drop(8)
}
Both of these will probably require some method whitelisting in order to be functional.
I had the same desire and rolled my own, maybe not pretty but it worked...
In your pipeline job, mark that "This project is parameterized" and add a parameter for your tag. Then in the pipeline script checkout the tag if it is present.
Create a freestyle job that runs a script to:
Checkout
Run git describe --tags --abbrev=0 to get the latest tag.
Check that tag against a running list of builds (like in a file).
If the build hasn't occurred, trigger the pipeline job via a url passing your tag as a parameter (in your pipeline job under "Build Triggers" set "Trigger builds remotely (e.g. from scripts) and it will show the correct url.
Add the tag to your running list of builds so it doesn't get triggered again.
Have this job run frequently.
if you use multibranch pipeline, there is a discover tag. Use that plus Spencer solution

how to capture jenkins changelist between two successful build

My requirement is to get the perforce change-list details from the last successful build to the latest successful build.
For Eg: I have Jenkins builds like below
JOB1:build#112 - Successful
JOB1:build#113 - Failed
JOB1:build#114 - Failed
JOB1:build#115 - Successful
I want Jenkins to show all p4 change-list in the build#115 that went in for build#113 and build#114 . Jenkins always show the p4 change-list between the last two build regardless of failure or successful build. I need this to generate the report that the particular successful build has these many p4 check-ins.
I am assuming from change-list you mean to say diff of configs between two successive build's.
For this we have JobConfigHistoryPlugin
where you can see all the config changes in GUI and can revert to any previous build config.
Hope it helps.
Edit:
Did you try PerforcePlugin or P4Plugin ?
There is one jenkins plugin which solved my query.
https://wiki.jenkins-ci.org/display/JENKINS/Changes+Since+Last+Success+Plugin

Make jenkins auto build one a day but build only when there are source code changed

I have problem in configure jenkins to auto build and deploy java project. I want to build and deploy once a day. However this build only there are changes during the day. IF there is no changes, I don't want jenkins to auto build and deploy.
Note: that I used gitlab as source code management.
Can you help me with this configuration.?
Firstly, you should configure the Git SCM section at the top of the job config page to point to your GitLab repository.
Then you can use the built-in "Poll SCM" build trigger — this will periodically check whether your source code repository has changed — and if it has, a build of this job will be started.
If the repository has not changed since the last build, then no build will be started.
You can configure this trigger — whether using a cron-like syntax, or a shortcut like #daily or #midnight — so that Jenkins only checks the source repository once a day.
Additionally, you should make sure that the "ignore post-commit hooks" option is enabled. If you're using webhooks from your Git repository to start Jenkins jobs whenever a commit occurs, this option prevents your once-per-day job from being triggered for every Git commit.
Here's the detail document: "Jenkins CI integration"
http://doc.gitlab.com/ee/integration/jenkins.html
Update to match your comment.
You don't want to trigger the Jenkins build via webhook. It's ok.
You want to check the code change 1 time a day.
Example on Linux, build at 6:00 AM if there's any code change.
Install
https://wiki.jenkins-ci.org/display/JENKINS/PostBuildScript+Plugin
https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin
Build Triggers
Build periodically: 0 6 * * *
Execute shell
Like this
SINCE=`curl http://192.168.0.1:8080/job/MyJava/lastStableBuild/buildTimestamp?format=dd-MMM-yyyy`
cd /opt/code/myjava/
git log --pretty="%h - %s" --author=gitster --since=$SINCE --before=$SINCE --no-merges -- t/
Post Build actions
Post build task
Log text: commit
Operation: AND
Script: Your script to build your Java
Jenkins text finder
Also search the console output
Regular expression: Could not match
Unstable if found

Resources