| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -81,6 +81,7 @@ def deviceStage(String stageName, String deviceType, List extra_env, def steps) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def extra = extra_env.collect { "export ${it}" }.join('\n'); | 
					 | 
					 | 
					 | 
					    def extra = extra_env.collect { "export ${it}" }.join('\n'); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def branch = env.BRANCH_NAME ?: 'master'; | 
					 | 
					 | 
					 | 
					    def branch = env.BRANCH_NAME ?: 'master'; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    def gitDiff = sh returnStdout: true, script: 'curl -s -H "Authorization: Bearer ${GITHUB_COMMENTS_TOKEN}" https://api.github.com/repos/commaai/openpilot/compare/master...${GIT_BRANCH} | jq .files[].filename', label: 'Getting changes' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    lock(resource: "", label: deviceType, inversePrecedence: true, variable: 'device_ip', quantity: 1, resourceSelectStrategy: 'random') { | 
					 | 
					 | 
					 | 
					    lock(resource: "", label: deviceType, inversePrecedence: true, variable: 'device_ip', quantity: 1, resourceSelectStrategy: 'random') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      docker.image('ghcr.io/commaai/alpine-ssh').inside('--user=root') { | 
					 | 
					 | 
					 | 
					      docker.image('ghcr.io/commaai/alpine-ssh').inside('--user=root') { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -91,9 +92,9 @@ def deviceStage(String stageName, String deviceType, List extra_env, def steps) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            device(device_ip, "git checkout", extra + "\n" + readFile("selfdrive/test/setup_device_ci.sh")) | 
					 | 
					 | 
					 | 
					            device(device_ip, "git checkout", extra + "\n" + readFile("selfdrive/test/setup_device_ci.sh")) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          } | 
					 | 
					 | 
					 | 
					          } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          steps.each { item -> | 
					 | 
					 | 
					 | 
					          steps.each { item -> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (branch != "master" && item.size() == 3 && !hasPathChanged(item[2])) { | 
					 | 
					 | 
					 | 
					            if (branch != "master" && item.size() == 3 && !hasPathChanged(gitDiff, item[2])) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              println "Skipping ${item[0]}: no changes in ${item[2]}." | 
					 | 
					 | 
					 | 
					              println "Skipping ${item[0]}: no changes in ${item[2]}." | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              return; | 
					 | 
					 | 
					 | 
					              return | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } else { | 
					 | 
					 | 
					 | 
					            } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              device(device_ip, item[0], item[1]) | 
					 | 
					 | 
					 | 
					              device(device_ip, item[0], item[1]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } | 
					 | 
					 | 
					 | 
					            } | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -104,29 +105,13 @@ def deviceStage(String stageName, String deviceType, List extra_env, def steps) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					@NonCPS | 
					 | 
					 | 
					 | 
					def hasPathChanged(String gitDiff, List<String> paths) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def hasPathChanged(List<String> paths) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  changedFiles = [] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for (changeLogSet in currentBuild.changeSets) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (entry in changeLogSet.getItems()) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for (file in entry.getAffectedFiles()) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        changedFiles.add(file.getPath()) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  env.CHANGED_FILES = changedFiles.join(" ") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (currentBuild.number > 1) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    env.CHANGED_FILES += currentBuild.previousBuild.getBuildVariables().get("CHANGED_FILES") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for (path in paths) { | 
					 | 
					 | 
					 | 
					  for (path in paths) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (env.CHANGED_FILES.contains(path)) { | 
					 | 
					 | 
					 | 
					    if (gitDiff.contains(path)) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      return true; | 
					 | 
					 | 
					 | 
					      return true | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  return false | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return false; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def setupCredentials() { | 
					 | 
					 | 
					 | 
					def setupCredentials() { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |