diff --git a/ci/run-jjb.py b/ci/run-jjb.py
index 7fba293..e669c0d 100755
--- a/ci/run-jjb.py
+++ b/ci/run-jjb.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python3
 
+import glob
 import os
 import shutil
 import signal
@@ -43,7 +44,7 @@
                         '[jenkins]\n'
                         'user=%s\n'
                         'password=%s\n'
-                        'url=https://ci.trustedfirmware.org/\n' % (jjb_user, jjb_password))
+                        'url=%s\n' % (jjb_user, jjb_password, jenkins_url))
     with open('jenkins_jobs.ini', 'w') as f:
         f.write(jenkins_jobs_ini)
     jjb_args.append('--conf=jenkins_jobs.ini')
@@ -62,45 +63,52 @@
     # Dry-run, don't delete jobs.
     jjb_delete_args.insert(0, 'echo')
 
-try:
-    git_args = ['git', 'diff', '--raw',
-                os.environ.get('GIT_PREVIOUS_COMMIT'),
-                os.environ.get('GIT_COMMIT')]
-    proc = subprocess.run(git_args, capture_output=True)
-except (OSError, ValueError) as e:
-    raise ValueError("%s" % e)
+if not os.environ.get('JJB_BOOTSTRAP', False):
+    try:
+        git_args = ['git', 'diff', '--raw',
+                    os.environ.get('GIT_PREVIOUS_COMMIT'),
+                    os.environ.get('GIT_COMMIT')]
+        proc = subprocess.run(git_args, capture_output=True)
+    except (OSError, ValueError) as e:
+        raise ValueError("%s" % e)
+    
+    data = proc.stdout.decode()
+    if proc.returncode != 0:
+        raise ValueError("command has failed with code '%s'" % proc.returncode)
 
-data = proc.stdout.decode()
-if proc.returncode != 0:
-    raise ValueError("command has failed with code '%s'" % proc.returncode)
 
 filelist = []
 deletelist = []
 files = []
-for line in data.splitlines():
-    # Format of the git-diff; we only need OPERATION and FILE1
-    #
-    # :<OLD MODE> <NEW MODE> <OLD REF> <NEW REF> <OPERATION> <FILE1> <FILE2>
-    elems = line.split()
-    operation = elems[4][0]
-    filename = elems[5]
-
-    if filename.endswith('.yaml') and '/' not in filename:
-        # No point trying to test deleted jobs because they don't exist any
-        # more.
-        if operation == 'D':
-            deletelist.append(filename[:-5])
-            continue
-        # operation R100 is 100% rename, which means sixth element is the renamed file
-        if operation == 'R':
-            filename = elems[6]
-            # delete old job name
-            deletelist.append(elems[5][:-5])
-        filelist.append(filename)
-    else:
-        files = findparentfiles(filename)
-        for tempname in files:
-            filelist.append(tempname)
+if not os.environ.get('JJB_BOOTSTRAP', False):
+    for line in data.splitlines():
+        # Format of the git-diff; we only need OPERATION and FILE1
+        #
+        # :<OLD MODE> <NEW MODE> <OLD REF> <NEW REF> <OPERATION> <FILE1> <FILE2>
+        elems = line.split()
+        operation = elems[4][0]
+        filename = elems[5]
+    
+        if filename.endswith('.yaml') and '/' not in filename:
+            # No point trying to test deleted jobs because they don't exist any
+            # more.
+            if operation == 'D':
+                deletelist.append(filename[:-5])
+                continue
+            # operation R100 is 100% rename, which means sixth element is the renamed file
+            if operation == 'R':
+                filename = elems[6]
+                # delete old job name
+                deletelist.append(elems[5][:-5])
+            filelist.append(filename)
+        else:
+            files = findparentfiles(filename)
+            for tempname in files:
+                filelist.append(tempname)
+else:
+    print(f"As JJB_BOOTSTRAP is set, finding yaml definitions from {os.getcwd()}")
+    for file in glob.glob("./*.yaml"):
+        filelist.append(file.replace("./", ""))
 
 # Remove duplicate entries in the list
 filelist = list(set(filelist))
