I have a Jenkins setup where i want to configure the environment variable before building my pipeline.
I can set the environment variable in the configure page and use it in Jobs. However, I can not give the Administrator permission to the user to set it up. In-order to set the Environment variable user should have the admin access.
I have taken a look into the Injecting Environment variable at the Job level by installing Environment inject plugin. In this case also, user has to come to the configuring the job and set up.
Please let me know if there is a way to have the external script file and set the environment variable through it.
You can use the "This project is parameterized" option in jenkins job configure page and pass the arguments.
You can also have "environment" block in Jenkinsfile to declare all the variable.
environment {
CC = 'clang'
}
Please follow the link for more information.
please refer https://jenkins.io/doc/book/pipeline/syntax/#environment
pipeline {
agent none
environment {
field = 'some'
}
stages {
stage ('Preparation') {
agent { label 'master'}
environment {
JENKINS_PATH = sh(script: 'pwd', , returnStdout: true).trim()
}
steps {
echo "Hello world"
echo "PATH=${JENKINS_PATH}"
sh 'echo "JP=$JENKINS_PATH"'
}
}
}
}
Related
How can I set a new environment variable from within a Jenkinsfile using declarative pipeline?
I know that I can read environment variables using env like this one for example ${env.JOB_NAME}.
But how can I set a new environment variable which can be be used by my build script for example. I want to do something like below. Is this the correct way?
stage("build_my_code") {
steps {
sh 'MY_ENV_VAR="some_value"'
sh './my_script.sh $MY_ENV_VAR'
}
}
You can use script step to run Groovy script in declarative pipeline,
Then in script step to set environment by env.xxx=yyy
stage("build_my_code") {
steps {
script {
// the MY_ENV_VAR environment variable should not exist,
// not allow to overwrite value of an existing environment variable.
env.MY_ENV_VAR="some_value"
}
sh './my_script.sh $MY_ENV_VAR'
}
}
I have a declarative pipeline job (this is not multi-branch pipeline job using Jenkinsfile) without parameters but some stages are conditional based on value in environment variable:
stage('deploy-release') {
when {
environment name: 'GIT_BRANCH', value: 'master'
}
steps {
sh "mvn deploy:deploy-file -B -DpomFile=pom.xml -Dfile=target/example.jar -DrepositoryId=maven-releases -Durl=${NEXUS_URL}/repository/maven-releases/"
}
}
I want to trigger the job from external system but I need to pass correct value of given environment variable. Is there some way how to do that via Jenkins Remote API?
For passing value of given environment variable, you need to define parameters with the exact same name as that of environment variable for your job by selecting "This build is parameterized".
You can refer Parameterized Build
In my pipeline, I would like to source a file, setting environment variables like . ./file.sh and keep them set for the rest of the pipeline.
I think this is not implemented given there's an issue opened for some years already https://issues.jenkins-ci.org/browse/JENKINS-10773
At the moment, I tested doing:
stage("Stage") {
steps {
sh ". ./file.sh && env"
sh "env"
}
}
The 2 env output different values. I expect Jenkins to create a new shell every time. Is there an option to not invoke a new shell?.
With what I know, I see 3 possibilities:
Execute all my commands in one sh statement or wrap the execution in a script. The problem is that it makes debugging quite hard.
Source the file at each sh command.
Create a custom groovy function wrapping the call.
The 2 last solutions sound dirty, any suggestion is welcome.
Looks like we can follow environment directive feature to handle both global variable and also stage specific variables.
So in your instance if you define all variables from file.sh within Global scope, then printing will give desired result.
pipeline {
agent any
environment {
myGlobVar = '2020'
}
stages {
stage('Example') {
environment {
myStgeSpecificVar = 2020.2
}
steps {
sh 'printenv'
}
}
}
}
I am building a declarative JenkinsFile, I have some common variables that I want to be shared across some Jenkins projects and jobs.
So I created a jenkins shared library, but for some reason i can't get my Jenkins file to to read the common environment variables from common groovy.
pipeline {
environment {
commonEnv()
Email_Notification_Enabled="true"
Slack_Notification_Enabled="false"
}
}
and in my groovy i had:
def call() {
a = "abc"
b = "abc"
}
It throws error that commonEnv() is not allowed in environments.
What is the possible way to achieve such behaviour.
You could write a Groovy method that sets the common environment variables. Please refer this Stack Overflow question to know how to do this. Include that method in Jenkins pipeline shared library.
Now call this Groovy method in declarative pipeline of each of your jobs. Remember that in a declarative pipeline, you may use Groovy only inside the script step. So, your pipeline would look something like:
pipeline {
stages {
stage("First stage") {
steps {
script {
// call to Groovy method that sets environment variables
}
// other steps
}
}
// other stages
}
}
Hope, it helps.
Since you need to have environment variables that are shared across all Jenkins projects and jobs, you should set them up on Jenkins instance level rather than on a Jenkins project or job level.
So, instead of doing it in a Jenkinsfile (which will do it at Jenkins job level), I will do it in Manage Jenkins > Configure System > Global properties > Environment Variables:
The environment variables could then be read in the pipeline script from Jenkins Global Variable env:
echo "This is my Jenkins global environment variable ${env.MY_ENV_VAR_NAME}"
In jenkins declarative pipeline, how can I set the value of an environment variable based on custom groovy/powershell method? For instance, if I have a delcarative pipeline as follows, can I use a shared library method to set this value?
Essentially I am trying to use a multibranch Declarative Pipeline jenkins job which has a deploy stage, but I need to ensure that develop branches are deployed to DEV, Release branches are deploying to STG, but using the same pipeline. My thought was to create an environment variable that is set based on a custom method (in perhaps Groovy in shared library), and that method would simply look at the current value for env.BRANCH and simply have a little logic to set the value of the target deploy environment. Here is an example of what I envision
pipeline {
environment {
DEPLOY_ENV = mapBranchToDeployEnvironment(${BRANCH})
}
And then in my deploy stage I would use this value in two powershell invocations
bat "powershell .\\Deploy-Service -Environment ${DEPLOY_ENV}"
bat "powershell .\\Deploy-ServiceProxy -Environment ${DEPLOY_ENV}"
Otherwise, How are people current solving the problem of using the same pipeline to deploy to different environments while using the variables across many other function invocations? What is the recommended approach from Jenkins on mapping a branch name that triggered the build to an environment (if any) it should be deployed to?
Based on my understanding, the Declarative Pipeline allows a pipeline to be "multibranch", which, if the job deploys as well, it needs to map to an deploy environment. How else would a pipeline deploy using multibranch to multiple environments when all the global jenkins pipeline environment variables are the same value for every job /branch execution?
In the above scenario, the pipeline variable 'DEPLOY_ENV' is derived from other environment variables that are set by the job and are available typically at the stage level, but here we are looking to set the value globally so that we can use it across stages
Update: My issue was that I didnt realize how simple it was and instead thought that I had to pass in a stage or script object into a groovy shared library function, when in fact its as simple as creating a shared library, then directly referencing the environment variables in the method. Easy. Thank you.
I had exactly the same problem, and indeed it is possible to use a shared library method. But there is another solution, more simple if you do not have a shared library set-up yet, that consists in defining a groovy method before the Pipeline statement and then use it inside your pipeline like this :
def getEnvFromBranch(branch) {
if (branch == 'master') {
return 'production'
} else {
return 'staging'
}
}
pipeline {
agent any
environment {
targetedEnv = getEnvFromBranch(env.BRANCH_NAME)
}
stages {
stage('Build') {
steps {
echo "Building in ${env.targetedEnv}"
}
}
}
}
You can do exactly what you're suggesting. You should create a jenkins shared library with a var (a new DSL method). These can be called to assign to a pipeline-wide environment variable. You had it basically correct. Here's a Jenkinsfile fragment to assign to an environment variable:
environment {
DEPLOY_ENV = mapBranchToDeployEnvironment()
}
You don't need to pass the branch to the mapBranchToDeployEnvironment DSL method, since you can access the branch in that method. sample contents of vars/mapBranchToDeployEnvironment.groovy in shared library look like this:
def call() {
echo "branch is: ${env.BRANCH_NAME}"
if (env.BRANCH_NAME == 'master') {
return 'prod'
} else {
return 'staging'
}
}
You probably shouldn't expect this to be a five minute task, but you'll get it. Good luck!
stage('Prepare env variables') {
steps {
script {
if (env.BRANCH_NAME == 'master') {
echo 'Copying project-stg.env file...';
sh 'cp /opt/project-stg.env .env';
} else {
echo 'Copying project-dev.env file...';
sh 'cp /opt/project-dev.env .env';
}
}
}
}