1
votes

Azure Pipelines - Télécharger des fichiers avec azcopy

Je vois qu'il existe une tâche pour télécharger des fichiers locaux sur le stockage Azure ou sur une machine virtuelle. Mais comment pouvons-nous télécharger à partir d'un objet blob ou d'un partage de fichiers dans l'agent de pipeline? Actuellement, j'utilise azcopy avec un URI SAS. Y a-t-il une tâche dans Pipelines qui le fera en utilisant une connexion de service à la place?


0 commentaires

3 Réponses :


0
votes

Autant que je sache, nous n'avons pas une telle tâche peut directement satisfaire vos besoins. Mais vous pouvez utiliser la tâche Azure CLi pour exécuter la commande.

À titre d'exemple, je peux exécuter az storage blob download dans Azure cli pour télécharger des fichiers depuis Azure Blob Storage:

steps:
- task: AzureCLI@1
  displayName: 'Azure CLI '
  inputs:
    azureSubscription: {service connection}
    scriptLocation: inlineScript
    inlineScript: |
     mkdir $(Build.SourcesDirectory)/BlobFile
     az storage blob download --container-name $(containername) --file $(Build.SourcesDirectory)/BlobFile --name "{file name}" --account-key $(accountkey) --account-name $(accountname)

La logique de ma suggestion consiste à utiliser mkdir pour créer un dossier dans le répertoire actuel, puis télécharger le fichier à partir de blob et l'enregistrer dans ce dossier. Vous pouvez suivre ceci pour exécuter votre commande azcopy .

Nous avons intégré la connexion de service dans cette tâche, afin que vous puissiez configurer la connexion de service pour vous connecter à votre blob Azure. Sélectionnez-le ensuite dans cette tâche Azure cli.


3 commentaires

Le stockage dont nous disposons se trouve dans un partage de fichiers Azure. Donc j'utilise actuellement "az storage file download-batch", qui est extrêmement lent. Je pourrais utiliser azcopy dans une tâche shell, mais je n'ai pas vu de moyen de générer des jetons SAS pour les partages de fichiers Azure qui incluent des autorisations de liste. Existe-t-il un moyen d'automatiser la génération d'un jeton SAS pour inclure les autorisations de liste lors de l'utilisation de "az storage file generate-sas"?


@philthy, Que signifie "automatiser la génération d'un jeton SAS"?


Voir ci-dessous, il existe un moyen de générer le jeton SAS avec Azure CLI au lieu de via le portail. Avec cela, je peux automatiser un pipeline à télécharger via azcopy.



3
votes

Donc, puisque je télécharge des fichiers depuis Azure Storage Share (pas de blob ni de conteneur), azcopy est beaucoup plus rapide. L'utilisation de az storage file download-batch était bien trop lente. Au lieu de cela, nous pouvons simplement utiliser bash pour appeler azcopy.

Installer azcopy dans l'agent de pipeline

- task: AzureCLI@2
  displayName: Download using azcopy
  inputs:
    azureSubscription: 'Service-Connection'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      end=`date -u -d "180 minutes" '+%Y-%m-%dT%H:%M:00Z'`
      sas=$(az storage share generate-sas -n share-name --account-name account-name --https-only --permissions lr --expiry $end -o tsv)
      $(Agent.ToolsDirectory)/azcopy/azcopy copy "https://account-name.file.core.windows.net/share-name/folder/?$sas" "/Download-Path" --recursive --check-md5=FailIfDifferent

Télécharger avec azcopy en utilisant az-cli tâche

- task: Bash@3
  displayName: Install azcopy
  inputs:
    targetType: 'inline'
    script: |
      curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
      mkdir $(Agent.ToolsDirectory)/azcopy
      wget -O $(Agent.ToolsDirectory)/azcopy/azcopy_v10.tar.gz https://aka.ms/downloadazcopy-v10-linux
      tar -xf $(Agent.ToolsDirectory)/azcopy/azcopy_v10.tar.gz -C $(Agent.ToolsDirectory)/azcopy --strip-components=1


1 commentaires

J'ai ouvert un problème concernant les performances de az storage file download-batch à github.com/Azure/azure-cli/issues/14374 .



0
votes

Pour moi, la réponse de @philthy n'a pas fonctionné car je suis tombé sur ce problème dans le référentiel Azure / azure-storage-azcopy GitHub. Ce qui suit a fonctionné pour moi.

- task: Bash@3
  displayName: Install azcopy
  inputs:
    targetType: 'inline'
    script: |
      curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
      mkdir $(Agent.ToolsDirectory)/azcopy && cd "$_"
      wget -O azcopy_v10.tar.gz https://aka.ms/downloadazcopy-v10-linux
      tar -xf azcopy_v10.tar.gz --strip-components=1
- task: AzureCLI@2
  displayName: Download using azcopy
  inputs:
    azureSubscription: my-vmssagents-service-connection
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      export STORE_NAME="data"
      export CONTAINER_NAME="data"
      export FOLDER="my_folder"

      NOW=`date +"%Y-%m-%dT%H:%M:00Z"` \
      EXPIRY=`date -d "$NOW + 1 day" +"%Y-%m-%dT%H:%M:00Z"` \
      && export SAS_TOKEN=$( az storage container generate-sas \
          --account-name $STORE_NAME \
          --name $CONTAINER_NAME \
          --start $NOW \
          --expiry $EXPIRY \
          --permissions acdlrw \
          --output tsv )

      $(Agent.ToolsDirectory)/azcopy/azcopy copy \
          "https://${STORE_NAME}.blob.core.windows.net/${CONTAINER_NAME}/${FOLDER}/?${SAS_TOKEN}" \
          "." --recursive --include-pattern "*c_*b.nc;left.nc;right.nc" # <-- my specific pattern


0 commentaires