@@ -9,11 +9,12 @@ stages:
99 pool :
1010 vmImage : ' ubuntu-24.04'
1111 steps :
12+ - checkout : none
1213 - script : |
13- sudo apt-get install -y uuid
14- AZURE_RESOURCE_GROUP="iotpythondpse2e$(uuid | tr -d '-') "
15- AZURE_IOTHUB_NAME="iotpythondpse2e$(uuid | tr -d '-') "
16- AZURE_DPS_NAME="iotpythondpse2e$(uuid | tr -d '-') "
14+ RESOURCE_SUFFIX=$(tr -d '-' < /proc/sys/kernel/random/ uuid)
15+ AZURE_RESOURCE_GROUP="iotpythondpse2e$RESOURCE_SUFFIX "
16+ AZURE_IOTHUB_NAME="iotpythondpse2e$RESOURCE_SUFFIX "
17+ AZURE_DPS_NAME="iotpythondpse2e$RESOURCE_SUFFIX "
1718
1819 # Export variables to other stages/jobs/steps.
1920 echo "##vso[task.setvariable variable=AZURE_RESOURCE_GROUP;isOutput=true]$AZURE_RESOURCE_GROUP"
@@ -178,8 +179,8 @@ stages:
178179 echo "##vso[task.setvariable variable=DPS_ROOT_CA_CERT_PATH;isOutput=true]$DPS_ROOT_CA_CERT_PATH"
179180 echo "##vso[task.setvariable variable=DPS_ROOT_CA_PK_PATH;isOutput=true]$DPS_ROOT_CA_PK_PATH"
180181 echo "##vso[task.setvariable variable=DPS_ROOT_CA_CERT_BASE64;isOutput=true]$DPS_ROOT_CA_CERT_BASE64"
181- echo "##vso[task.setvariable variable=DPS_ROOT_CA_PK_BASE64;isOutput=true]$DPS_ROOT_CA_PK_BASE64"
182- echo "##vso[task.setvariable variable=DPS_ROOT_CA_PASSWORD;isOutput=true]$DPS_ROOT_CA_PASSWORD"
182+ echo "##vso[task.setvariable variable=DPS_ROOT_CA_PK_BASE64;isOutput=true;isSecret=true ]$DPS_ROOT_CA_PK_BASE64"
183+ echo "##vso[task.setvariable variable=DPS_ROOT_CA_PASSWORD;isOutput=true;isSecret=true ]$DPS_ROOT_CA_PASSWORD"
183184 echo "##vso[task.setvariable variable=DPS_ROOT_CA_CONFIG_PATH;isOutput=true]$DPS_ROOT_CA_CONFIG_PATH"
184185 name: testCertificates
185186 displayName: Create Test Certificates
@@ -202,19 +203,22 @@ stages:
202203 # Create Resource Group
203204 az group create -g $AZURE_RESOURCE_GROUP -l $(AZURE_REGION)
204205
205- # Create Azure IoT Hub
206- time az iot hub create -g $AZURE_RESOURCE_GROUP -n $AZURE_IOTHUB_NAME --dla false --mintls 1.2 --partition-count 4 --sku S1
206+ # Create independent resources concurrently, then wait before linking them.
207+ time az iot hub create -g $AZURE_RESOURCE_GROUP -n $AZURE_IOTHUB_NAME --dla false --mintls 1.2 --partition-count 4 --sku S1 &
208+ iothub_create_pid=$!
209+ time az iot dps create -g $AZURE_RESOURCE_GROUP --name $AZURE_DPS_NAME -l $(AZURE_REGION) &
210+ dps_create_pid=$!
211+
212+ create_failed=0
213+ wait "$iothub_create_pid" || create_failed=1
214+ wait "$dps_create_pid" || create_failed=1
215+ if (( create_failed )); then
216+ exit 1
217+ fi
207218
208219 export IOTHUB_CONNECTION_STRING=$(az iot hub connection-string show -g $AZURE_RESOURCE_GROUP --hub-name $AZURE_IOTHUB_NAME --pn iothubowner --query "connectionString" --output tsv)
209220 export EVENTHUB_CONNECTION_STRING=$(az iot hub connection-string show -g $AZURE_RESOURCE_GROUP --hub-name $AZURE_IOTHUB_NAME --eh --query "connectionString" --output tsv)
210221
211- for i in $(seq 1 11); do
212- cg_name="cg$i"
213- az iot hub consumer-group create -g "$AZURE_RESOURCE_GROUP" --hub-name "$AZURE_IOTHUB_NAME" --name "$cg_name"
214- done
215-
216- # Create Device Provisioning service
217- time az iot dps create -g $AZURE_RESOURCE_GROUP --name $AZURE_DPS_NAME -l $(AZURE_REGION)
218222 time az iot dps linked-hub create -g $AZURE_RESOURCE_GROUP --dps-name $AZURE_DPS_NAME --connection-string "$IOTHUB_CONNECTION_STRING"
219223
220224 export DPS_CONNECTION_STRING=$(az iot dps connection-string show -g $AZURE_RESOURCE_GROUP --dps-name $AZURE_DPS_NAME --policy-name provisioningserviceowner --query "connectionString" --output tsv)
@@ -245,9 +249,9 @@ stages:
245249 time az iot dps certificate verify --dps-name $AZURE_DPS_NAME --resource-group $AZURE_RESOURCE_GROUP --name $DPS_ROOT_CA_CERT_NAME --path $verification_code_pem_path --etag $etag
246250
247251 # Export variables to other stages/jobs/steps.
248- echo "##vso[task.setvariable variable=IOTHUB_CONNECTION_STRING;isOutput=true]$IOTHUB_CONNECTION_STRING"
249- echo "##vso[task.setvariable variable=EVENTHUB_CONNECTION_STRING;isOutput=true]$EVENTHUB_CONNECTION_STRING"
250- echo "##vso[task.setvariable variable=DPS_CONNECTION_STRING;isOutput=true]$DPS_CONNECTION_STRING"
252+ echo "##vso[task.setvariable variable=IOTHUB_CONNECTION_STRING;isOutput=true;isSecret=true ]$IOTHUB_CONNECTION_STRING"
253+ echo "##vso[task.setvariable variable=EVENTHUB_CONNECTION_STRING;isOutput=true;isSecret=true ]$EVENTHUB_CONNECTION_STRING"
254+ echo "##vso[task.setvariable variable=DPS_CONNECTION_STRING;isOutput=true;isSecret=true ]$DPS_CONNECTION_STRING"
251255 echo "##vso[task.setvariable variable=DPS_ID_SCOPE;isOutput=true]$DPS_ID_SCOPE"
252256 echo "##vso[task.setvariable variable=DPS_HOSTNAME;isOutput=true]$DPS_HOSTNAME"
253257 displayName : Create IoT Hub & DPS
@@ -273,11 +277,23 @@ stages:
273277 versionSpec : ' 3.10'
274278 architecture : ' x64'
275279
280+ # Cache downloads without reusing the job environment.
281+ - task : Cache@2
282+ displayName : ' Cache uv'
283+ inputs :
284+ key : ' "uv" | "$(Agent.OS)" | "3.10" | uv.lock'
285+ restoreKeys : |
286+ "uv" | "$(Agent.OS)" | "3.10"
287+ "uv" | "$(Agent.OS)"
288+ path : $(Pipeline.Workspace)/.uv-cache
289+
276290 - script : ' python -m pip install uv'
277291 displayName : ' Install uv'
278292
279293 - script : ' uv sync --upgrade --python 3.10 --no-dev --group test --group e2e'
280294 displayName : ' Sync E2E environment'
295+ env :
296+ UV_CACHE_DIR : $(Pipeline.Workspace)/.uv-cache
281297
282298 - script : |
283299 cd $(Agent.WorkFolder)
@@ -322,6 +338,7 @@ stages:
322338 variables :
323339 AZURE_RESOURCE_GROUP : $[stageDependencies.setup.create_azure_resources.outputs['setResourceNames.AZURE_RESOURCE_GROUP']]
324340 steps :
341+ - checkout : none
325342 - task : AzureCLI@2
326343 inputs :
327344 azureSubscription : ' iot hub sdk service connection'
0 commit comments