Sample Jenkinsfile
A Jenkinsfile is a text file that contains the
definition of a Jenkins Pipeline. This Jenkinsfile
shows how to integrate Salesforce CLI commands to automate testing of your Salesforce
applications using scratch orgs.
The Jenkinsfile Walkthrough topic uses this sfdx-jenkins-package Jenkinsfile as an example.
#!groovy
import groovy.json.JsonSlurperClassic
node {
def SF_CONSUMER_KEY=env.SF_CONSUMER_KEY
def SF_USERNAME=env.SF_USERNAME
def SERVER_KEY_CREDENTALS_ID=env.SERVER_KEY_CREDENTALS_ID
def TEST_LEVEL='RunLocalTests'
def PACKAGE_NAME='0Ho1U000000CaUzSAK'
def PACKAGE_VERSION
def SF_INSTANCE_URL = env.SF_INSTANCE_URL ?: "https://login.salesforce.com"
def toolbelt = tool 'toolbelt'
// -------------------------------------------------------------------------
// Check out code from source control.
// -------------------------------------------------------------------------
stage('checkout source') {
checkout scm
}
// -------------------------------------------------------------------------
// Run all the enclosed stages with access to the Salesforce
// JWT key credentials.
// -------------------------------------------------------------------------
withEnv(["HOME=${env.WORKSPACE}"]) {
withCredentials([file(credentialsId: SERVER_KEY_CREDENTALS_ID, variable: 'server_key_file')]) {
// -------------------------------------------------------------------------
// Authorize the Dev Hub org with JWT key and give it an alias.
// -------------------------------------------------------------------------
stage('Authorize DevHub') {
rc = command "${toolbelt}/sf org login jwt --instance-url ${SF_INSTANCE_URL} --client-id ${SF_CONSUMER_KEY} --username ${SF_USERNAME} --jwt-key-file ${server_key_file} --set-default-dev-hub --alias HubOrg"
if (rc != 0) {
error 'Salesforce dev hub org authorization failed.'
}
}
// -------------------------------------------------------------------------
// Create new scratch org to test your code.
// -------------------------------------------------------------------------
stage('Create Test Scratch Org') {
rc = command "${toolbelt}/sf org create scratch --target-dev-hub HubOrg --set-default --definition-file config/project-scratch-def.json --alias ciorg --wait 10 --duration-days 1"
if (rc != 0) {
error 'Salesforce test scratch org creation failed.'
}
}
// -------------------------------------------------------------------------
// Display test scratch org info.
// -------------------------------------------------------------------------
stage('Display Test Scratch Org') {
rc = command "${toolbelt}/sf org display --target-org ciorg"
if (rc != 0) {
error 'Salesforce test scratch org display failed.'
}
}
// -------------------------------------------------------------------------
// Push source to test scratch org.
// -------------------------------------------------------------------------
stage('Push To Test Scratch Org') {
rc = command "${toolbelt}/sf project deploy start --target-org ciorg"
if (rc != 0) {
error 'Salesforce push to test scratch org failed.'
}
}
// -------------------------------------------------------------------------
// Run unit tests in test scratch org.
// -------------------------------------------------------------------------
stage('Run Tests In Test Scratch Org') {
rc = command "${toolbelt}/sf apex run test --target-org ciorg --wait 10 --result-format tap --code-coverage --test-level ${TEST_LEVEL}"
if (rc != 0) {
error 'Salesforce unit test run in test scratch org failed.'
}
}
// -------------------------------------------------------------------------
// Delete test scratch org.
// -------------------------------------------------------------------------
stage('Delete Test Scratch Org') {
rc = command "${toolbelt}/sf org delete scratch --target-org installorg --no-prompt"
if (rc != 0) {
error 'Salesforce test scratch org deletion failed.'
}
}
// -------------------------------------------------------------------------
// Create package version.
// -------------------------------------------------------------------------
stage('Create Package Version') {
if (isUnix()) {
output = sh returnStdout: true, script: "${toolbelt}/sf package version create --package ${PACKAGE_NAME} --installation-key-bypass --wait 10 --json --target-dev-hub HubOrg"
} else {
output = bat(returnStdout: true, script: "${toolbelt}/sf package version create --package ${PACKAGE_NAME} --installation-key-bypass --wait 10 --json --target-dev-hub HubOrg").trim()
output = output.readLines().drop(1).join(" ")
}
// Wait 5 minutes for package replication.
sleep 300
def jsonSlurper = new JsonSlurperClassic()
def response = jsonSlurper.parseText(output)
PACKAGE_VERSION = response.result.SubscriberPackageVersionId
response = null
echo ${PACKAGE_VERSION}
}
// -------------------------------------------------------------------------
// Create new scratch org to install package to.
// -------------------------------------------------------------------------
stage('Create Package Install Scratch Org') {
rc = command "${toolbelt}/sf org create scratch --target-dev-hub HubOrg --set-default --definition-file config/project-scratch-def.json --alias installorg --wait 10 --duration-days 1"
if (rc != 0) {
error 'Salesforce package install scratch org creation failed.'
}
}
// -------------------------------------------------------------------------
// Display install scratch org info.
// -------------------------------------------------------------------------
stage('Display Install Scratch Org') {
rc = command "${toolbelt}/sf org display --target-org installorg"
if (rc != 0) {
error 'Salesforce install scratch org display failed.'
}
}
// -------------------------------------------------------------------------
// Install package in scratch org.
// -------------------------------------------------------------------------
stage('Install Package In Scratch Org') {
rc = command "${toolbelt}/sf package install --package ${PACKAGE_VERSION} --target-org installorg --wait 10"
if (rc != 0) {
error 'Salesforce package install failed.'
}
}
// -------------------------------------------------------------------------
// Run unit tests in package install scratch org.
// -------------------------------------------------------------------------
stage('Run Tests In Package Install Scratch Org') {
rc = command "${toolbelt}/sf apex run test --target-org installorg --result-format tap --code-coverage --test-level ${TEST_LEVEL} --wait 10"
if (rc != 0) {
error 'Salesforce unit test run in pacakge install scratch org failed.'
}
}
// -------------------------------------------------------------------------
// Delete package install scratch org.
// -------------------------------------------------------------------------
stage('Delete Package Install Scratch Org') {
rc = command "${toolbelt}/sf org delete scratch --target-org installorg --no-prompt"
if (rc != 0) {
error 'Salesforce package install scratch org deletion failed.'
}
}
}
}
}
def command(script) {
if (isUnix()) {
return sh(returnStatus: true, script: script);
} else {
return bat(returnStatus: true, script: script);
}
}