diff --git a/jenkins/ci-pipelines/ci_stage_2.groovy b/jenkins/ci-pipelines/ci_stage_2.groovy
index e3e86c5..fa94d4b 100644
--- a/jenkins/ci-pipelines/ci_stage_2.groovy
+++ b/jenkins/ci-pipelines/ci_stage_2.groovy
@@ -52,7 +52,7 @@
 
     stage('Release Note Check') {
       if (fileExists('devops-stages/stage-releasenote.sh')) {
-        if (!sMergeJob) {
+        if (!isMergeJob) {
             sh "devops-stages/stage-releasenote.sh"
         }
         else {
@@ -146,73 +146,75 @@
         concurrency = sh(returnStdout: true, script: "expr `nproc` / 2").trim() as int
         for (charmPath in charms) {
             def directory = charmPath
-            CHECK_CHANGES = "git diff --name-only origin/$GERRIT_BRANCH -- $directory |wc -l"
-            charmsChanged = sh(returnStdout:true,  script: CHECK_CHANGES).trim()
-            if (charmsChanged != "0" || isMergeJob) {
-                println("$directory has changes, rebuilding")
+            if (fileExists("$charmPath/charmcraft.yaml")) {
+                CHECK_CHANGES = "git diff --name-only origin/$GERRIT_BRANCH -- $directory |wc -l"
+                charmsChanged = sh(returnStdout:true,  script: CHECK_CHANGES).trim()
+                if (charmsChanged != "0" || isMergeJob) {
+                    println("$directory has changes, rebuilding")
 
-                parallelSteps[directory] = {
-                    waitUntil(quiet: true, initialRecurrencePeriod: 5) {
-                        if (concurrency > 0) {
-                            concurrency--
-                            true
-                        } else {
-                            sleep 5
-                            false
-                        }
-                    }
-                    try {
-                        dir("${directory}") {
-                            try {
-                                sh "charmcraft pack --format json --verbosity brief 1> pack.json 2> pack-stderr.log"
-                            } catch (Exception e) {
-                                sh "cat pack-stderr.log"
-                                throw e
+                    parallelSteps[directory] = {
+                        waitUntil(quiet: true, initialRecurrencePeriod: 5) {
+                            if (concurrency > 0) {
+                                concurrency--
+                                true
+                            } else {
+                                sleep 5
+                                false
                             }
-
-                            def resourceName = sh(
-                                returnStdout: true,
-                                script: 'cat pack.json | jq -r ".charms[0], .bundles[0]" | grep -v null').trim()
-
-                            withCredentials([string(credentialsId: 'Charmstore', variable: 'CHARMCRAFT_AUTH')]) {
-                                commandOutput = sh(returnStdout:true, script: "charmcraft whoami")
+                        }
+                        try {
+                            dir("${directory}") {
                                 try {
-                                    println("Uploading $resourceName")
-                                    sh "charmcraft upload --format json --verbosity brief $resourceName 1> upload.json 2> upload-stderr.log"
+                                    sh "charmcraft pack --format json --verbosity brief 1> pack.json 2> pack-stderr.log"
                                 } catch (Exception e) {
-                                    def errorMessage = sh(
-                                        returnStdout: true,
-                                        script: 'cat upload.json | jq -r ".errors[0].message" | grep -v null').trim()
-                                    if (errorMessage.contains("already exists")) {
-                                        println("No changes, skipping upload")
-                                        return 0
-                                    }
-                                    sh "cat upload-stderr.log"
+                                    sh "cat pack-stderr.log"
                                     throw e
                                 }
-                                def charmRevision = sh(
+
+                                def resourceName = sh(
                                     returnStdout: true,
-                                    script: 'cat upload.json | jq -r ".revision"').trim()
+                                    script: 'cat pack.json | jq -r ".charms[0], .bundles[0]" | grep -v null').trim()
 
-                                def charmBranch="merged"
-                                if ( !JOB_NAME.contains('merge') ) {
-                                    charmBranch="${GERRIT_REFSPEC}".replaceAll('/','-')
-                                }
-                                def channel="latest"
-                                if (BRANCH_NAME.startsWith("v")) {
-                                    channel=BRANCH_NAME.substring(1)
-                                } else if (BRANCH_NAME!="master") {
-                                    REV="/"+BRANCH_NAME+REV.replaceAll('/','-')
-                                }
+                                withCredentials([string(credentialsId: 'Charmstore', variable: 'CHARMCRAFT_AUTH')]) {
+                                    commandOutput = sh(returnStdout:true, script: "charmcraft whoami")
+                                    try {
+                                        println("Uploading $resourceName")
+                                        sh "charmcraft upload --format json --verbosity brief $resourceName 1> upload.json 2> upload-stderr.log"
+                                    } catch (Exception e) {
+                                        def errorMessage = sh(
+                                            returnStdout: true,
+                                            script: 'cat upload.json | jq -r ".errors[0].message" | grep -v null').trim()
+                                        if (errorMessage.contains("already exists")) {
+                                            println("No changes, skipping upload")
+                                            return 0
+                                        }
+                                        sh "cat upload-stderr.log"
+                                        throw e
+                                    }
+                                    def charmRevision = sh(
+                                        returnStdout: true,
+                                        script: 'cat upload.json | jq -r ".revision"').trim()
 
-                                def charmName = sh(
-                                    returnStdout:true,
-                                    script: "if [ -f bundle.yaml ];then cat bundle.yaml;else cat metadata.yaml;fi|yq -r .name").trim()
-                                sh "charmcraft release ${charmName} --revision=${charmRevision} --channel=${channel}/edge/${charmBranch}"
+                                    def charmBranch="merged"
+                                    if ( !JOB_NAME.contains('merge') ) {
+                                        charmBranch="${GERRIT_REFSPEC}".replaceAll('/','-')
+                                    }
+                                    def channel="latest"
+                                    if (BRANCH_NAME.startsWith("v")) {
+                                        channel=BRANCH_NAME.substring(1)
+                                    } else if (BRANCH_NAME!="master") {
+                                        REV="/"+BRANCH_NAME+REV.replaceAll('/','-')
+                                    }
+
+                                    def charmName = sh(
+                                        returnStdout:true,
+                                        script: "if [ -f bundle.yaml ];then cat bundle.yaml;else cat metadata.yaml;fi|yq -r .name").trim()
+                                    sh "charmcraft release ${charmName} --revision=${charmRevision} --channel=${channel}/edge/${charmBranch}"
+                                }
                             }
+                        } finally {
+                            concurrency++
                         }
-                    } finally {
-                        concurrency++
                     }
                 }
             }
