Is there anyway to build application with special commit in Jenkins? - jenkins

I have automated an application using Jenkins. When I push my code to master branch, Jenkins script runs and rebuild the application. This is my current situation.
What I need to do now, When I push with specific commit message only, I need to trigger the Jenkins build. (For an example, Commit message consist of "Build" keywork can only build the application again.)
Ex:-
git commit -m "Build | this is demo commit" - should be build the application.
git commit -m "this is demo commit" - should not be rebuild.
Am I possible to do that?

Here is how you can do this with a declarative pipeline. Note the condition when { changelog 'Build |.*'}
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git (url: 'https://github.com/ycr/sample.git', branch: 'main')
}
}
stage('Build') {
when { changelog 'Build |.*' }
steps {
echo "BUILDING"
}
}
}
}

Related

Disable script from git SCM changelog in Jenkins pipeline job

I have a question when I use pipeline with git SCM, currently I push all Jenkinsfile script in git with master branch. But when I modify one Jenkinsfile script when the another pipeline job be trigger will only show the changes, It's very upset when I only when to check build changes.
for example:
I config pipeline with git SCM (git: xxx/jenkinsJob, branch: master, script: a.jenkinsfile)
# a.jenkinsfile
stage('Checkout external proj') {
steps {
git branch: 'my_specific_branch',
credentialsId: 'my_cred_id',
url: 'ssh://git#test.com/proj/test_proj.git'
}
}
After I modify b.jenkinsJob in git://xxx/jenkinsJob, when I trigger e A pipeline job,
the A job will show two git change for "xxx/jenkinsJob" and "git#test.com/proj/test_proj"
like:
# changes
b.jenkinsfile change message 1
b.jenkinsfile change message 2
b.jenkinsfile change message 3
a.jenkinsfile change message 2
..
test_proj change message
I know how to disable changelog in jenkinsfile.
git changelog: false, branch: 'my_specific_branch', url: 'ssh://git#test.com/proj/test_proj.git'
But in jenkins job configuration page, can not find any way to do that..
https://plugins.jenkins.io/git/
Is there any way to avoid disable changelog in jenkins pipeline script for Git SCM ?, let only show test_proj changes.
thanks!
Currently I use this way to clear changeLog, use currentBuild.getChangeSets().clear()
pipeline {
stages {
stage('Checkout') {
steps {
script {
currentBuild.getChangeSets().clear()
}
git branch: "master", url: 'ssh://xxx/test.git'
}
}
}
}

Unable to skip Jenkins Build by SCM Skip Plugin

I am working on a pipeline script in Jenkins to build the project based on a commit message. From Jenkins' forum, I noticed that we can use SCM skip plugin. I installed the plugin and added the below stage as the forum suggests:
scmSkip(deleteBuild: true, skipPattern:'.*\\[ci skip\\].*')
When I commit a change with the following commit message:
git commit -m "[ci skip] Updated Audit Test Data Files with scan status"
The build is not skipped. It progresses with the other stages.
In console logs, I see the message
SCM Skip: Changelog is empty!
How do I construct the scmSkip call to skip the build when a commit message including "[ci skip]" is found? Are there alternatives that are easier to implement?
Thanks,
Karthik P.
It's probably because you didn't checkout first the repository
Be sure you aren't skipping the scm default checkout (via skipDefaultCheckout true) on the node where the build is running.
pipeline {
options {
skipDefaultCheckout false
}
stages {
stage('Check for Skip') {
steps {
scmSkip(deleteBuild: true, skipPattern:'.*\\[ci skip\\].*')
}
}
...

Is there a way for a Jenkins Pipeline, in a Multibranch setup, to automatically checkout the branch that is at the latest revision?

I'm trying to configure job in Jenkins Multibranch pipeline. There are a lot of branches in SVN and I want the job to checkout only the latest one and ignores the rest of them. This job triggers a pipeline that does multiple checks on the whole build... so I always need to trigger this on the latest branch because there I will have the latest revision of the build.
The SVN structure is like this: V01_01_01 till the latest one V01_08_03. Currently I have it set up like the below and in the Jenkins pipeline I have "checkout scm", but if a new branch appears e.g. V01_08_04 I need V01_08_03 to be replaced by V01_08_04. Is there any way to do this ?
My set-up in Jenkins Multibranch pipeline
I found a hack to this. I created a python script that checks the whole repository for the latest folder that was updated.
pipeline
{
agent any
parameters
{
string(name: 'latest_folder', defaultValue: '')
}
stages
{
stage ('find latest folder')
{
steps
{
withPythonEnv('System-CPython-3.8')
{
sh 'pip3 install svn'
script {
def folder_name = sh(script: 'python3 latest_folder_svn.py', returnStdout: true)
env.latest_folder = folder_name
}
}
}
}
stage ('Checkout Step')
{
steps
{
echo "${env.latest_folder}"
}
}
}
}
This variable I will add it in the checkout step in order to have always the latest branch.
The python script is pretty straightforward. I use svn library to parse the repository and extract what I need.

Triggering job on github pr to a specific branch

I am using the github branch source plugin: https://github.com/jenkinsci/github-branch-source-plugin to trigger jobs from github pr.
I would like jenkins trigger a build only when a pr to the master branch is made. I tried to use the branch filter plugin but it doesn't trigger at any pr. I guess it doesnt work on prs, only on direct push to branches.
is that possible?
this should to the trick. (there is a downside though as this condition is not on a plugin level, so the build will be triggered on other events too)
stage('build') {
when {
allOf {
branch 'PR-*'
environment name: 'CHANGE_TARGET', value: 'master'
}
}
steps {
sh 'building pr on master'
}
}

Jenkins Pipeline Build Trigger with git pull, how?

I've got a maven, java project and I'm using git.
I want to use jenkins for build + test + deploy (.war file) on tomcat server (on same device)
My current question is about triggering the build with pushing changes into the git repository master. However it did work with jenkins freestyle project. There I could setup my git repository, so it detected any changes and run the build.
But as far as I could make my research using a "pipeline" should be better to run the process with build + test + deploy. So I created a pipeline and also wrote a jenkinsfile.
pipeline {
agent any
stages {
stage('Compile Stage') {
steps {
withMaven(maven: 'maven_3_5_1'){
bat 'mvn clean compile'
}
}
}
stage('Testing Stage') {
steps {
withMaven(maven: 'maven_3_5_1'){
bat 'mvn test'
}
}
}
stage('Deployment Stage (WAR)') {
steps {
withMaven(maven: 'maven_3_5_1'){
bat 'mvn deploy'
}
}
}
}
}
The current problem is, that inside a pipeline project I could not find an option for setting up the git repository. Currently jenkins does not track any changes in git, when I push a change.
What I've to do, so jenkins runs build when changes are detected in git (like in the freestyle project)?
I thank you very much in advance.
Definition Inside the Repository (Jenkinsfile)
You should place the pipeline definition into a file called Jenkinsfile inside your repository.
This has the great advantage that your pipeline is also versioned. Using the Multibranch Project, you can point Jenkins to your Git repo and it will automatically discover all branches containing such Jenkinsfile (and create a job for each of them). You can find more information in the documentation.
In case you don't want jobs for different branches, you can also configure the job to take the pipeline definition from SCM:
With that specified, you can configure the job to poll SCM changes regularly:
Definition in the Job
In case you really don't want to put your pipeline into the repository (I don't recommend this), then you can use the checkout step to get your code:
pipeline {
agent any
stages {
stage('Compile Stage') {
steps {
checkout('https://git.example.com/repo.git')
withMaven(maven: 'maven_3_5_1') {
bat 'mvn clean compile'
}
}
}
// ...
More options for the checkout (e.g. other branches) can be found in the step documentation.
Finally, change the job to be built in regular intervals:
And now comes the point where I'm struggling (while editing the post): This probably builds the project every time (5min in the example). I am not sure, if currentBuild.changeSets contains the changes that are explicitly checked out with checkout. If it does, then you can check, if it contains changes and in such cases abort the build. All not very nice...

Resources