Automatizar builds, testes e implantações de um projeto do Stream Analytics

O pacote CI/CD npm do Azure Stream Analytics (ASA) permite que você compile, teste e implante automaticamente seus projetos do Stream Analytics. Este artigo mostra como usar o pacote npm com qualquer sistema de CI/CD. Para definir um pipeline com o Azure DevOps, consulte Usar o Azure DevOps para criar um pipeline de CI/CD para um trabalho do Stream Analytics.

Se você não tiver um projeto do Stream Analytics, crie um usando o Visual Studio Code ou exporte um existente do portal do Azure.

Instalação

Você pode baixar o pacote do site npm ou executar o comando a seguir em seu terminal.

npm install -g azure-streamanalytics-cicd

Compilar projeto

Observação

É altamente recomendável que você use a opção --v2 para o esquema de modelo do ARM atualizado. O esquema atualizado tem menos parâmetros, mas mantém a mesma funcionalidade que a versão anterior.

O modelo do ARM antigo será preterido no futuro. Depois disso, somente os modelos criados por meio de build --v2 receberão atualizações ou correções de bugs.

azure-streamanalytics-cicd build --v2 --project <projectFullPath> [--outputPath <outputPath>]

O comando build faz uma verificação de sintaxe de palavra-chave e gera o modelo do Azure Resource Manager (ARM).

Argumento Descrição
--project Especifique o arquivo asaproj.json usando o caminho absoluto ou relativo.
--outputPath Especifique a pasta de saída para armazenar modelos do ARM usando o caminho absoluto ou relativo. CasooutputPath não seja especificado, os modelos serão colocados no diretório atual.

Exemplo:

# Go to the project directory
cd <path-to-the-project>

# Build project
azure-streamanalytics-cicd build --v2 --project ./asaproj.json --outputPath ./Deploy

Se o projeto for compilado com êxito, você verá dois arquivos JSON criados na pasta de saída:

  • Arquivo de modelo do ARM: [ProjectName].JobTemplate.json
  • Arquivo de parâmetro do ARM: [ProjectName].JobTemplate.parameters.json

Os valores padrão para o arquivo parameters.json vêm das configurações do projeto. Se você deseja implantar em outro ambiente, apenas substitua os parâmetros adequadamente.

Os valores padrão para todas as credenciais são null. Você precisa definir os valores antes de implantar no Azure.

"Input_EntryStream_sharedAccessPolicyKey": {
  "value": null
}

Para usar a Identidade Gerenciada para o Azure Data Lake Storage Gen1 como coletor de saída, você precisará fornecer Acesso à entidade de serviço usando o PowerShell antes da implantação no Azure. Saiba mais sobre como implantar o ADLS Gen1 com a Identidade Gerenciada e o modelo do Resource Manager.

Executar localmente

Se o projeto tiver especificado arquivos de entrada locais, você pode executar um script do Stream Analytics localmente usando o comando localrun.

azure-streamanalytics-cicd localrun -project <projectFullPath> [-outputPath <outputPath>] [-customCodeZipFilePath <zipFilePath>]
Argumento Descrição
--project Especifique o arquivo asaproj.json usando o caminho absoluto ou relativo.
--outputPath Especifique a pasta de saída para armazenar modelos do ARM usando o caminho absoluto ou relativo. CasooutputPath não seja especificado, os modelos serão colocados no diretório atual.
--customCodeZipFilePath O caminho do arquivo zip do código personalizado em C#, como um UDF ou um desserializador, se eles forem usados. Empacote as DLLs em um arquivo zip e especifique esse caminho.

Exemplo:

# Go to the project directory
cd <path-to-the-project>

# Run project locally
azure-streamanalytics-cicd localrun --project ./asaproj.json"

Observação

O UDF do JavaScript só funciona no Windows.

Testes automatizados

Você pode usar o pacote npm de CI/CD para configurar e executar testes automatizados para o seu projeto do Stream Analytics.

Adicionar um caso de teste

azure-streamanalytics-cicd addtestcase --project <projectFullPath> [-testConfigPath <testConfigFileFullPath>]

Você pode encontrar os casos de teste no arquivo de configuração de teste.

Argumento Descrição
--project Especifique o arquivo asaproj.json usando o caminho absoluto ou relativo.
--testConfigPath O caminho do arquivo de configuração de teste. Se não for especificado, o arquivo será pesquisado em \test no diretório atual do arquivo asaproj.json com o nome de arquivo padrãotestConfig.json. Um novo arquivo será criado se não houver nenhum.

Exemplo:

# Go to the project directory
cd <path-to-the-project>

# Add a test case
azure-streamanalytics-cicd addtestcase --project ./asaproj.json

Se o arquivo de configuração de teste estiver vazio, o conteúdo a seguir será adicionado ao arquivo. Caso contrário, um caso de teste será adicionado a uma matriz TestCases. As configurações de entrada necessárias são preenchidas automaticamente de acordo com os arquivos de configuração de entrada. Antes de executar o teste, deve ser especificado o FilePath de cada entrada e saída esperadas. É possível modificar a configuração manualmente.

Se você quiser que a validação do teste ignore uma determinada saída, defina o campoObrigatório dessa saída esperada como false.

{
  "Script": [Absolute path of your script],
  "TestCases": [
    {
      "Name": "Case 1",
      "Inputs": [
        {
          "InputAlias": [Input alias string],
          "Type": "Data Stream",
          "Format": "JSON",
          "FilePath": [Required],
          "ScriptType": "InputMock"
        }
      ],
      "ExpectedOutputs": [
        {
          "OutputAlias": [Output alias string],
          "FilePath": [Required],
          "IgnoreFields": [Fields to ignore for test validation, e.g., ["col1", "col2"]],
          "Required": true
        }
      ]
    }
  ]
}

Executar teste de unidade

Você pode usar o comando a seguir para executar vários casos de teste no seu projeto. Um resumo dos resultados de teste é gerado na pasta de saída. O processo é encerrado com o código 0 para todos os testes aprovados; -1 caso ocorram exceções; e -2 para testes com falha.

azure-streamanalytics-cicd test --project <projectFullPath> [--testConfigPath <testConfigFileFullPath>] [--outputPath <outputPath>] [--customCodeZipFilePath <zipFilePath>]
Argumento Descrição
--project O caminho do arquivo asaproj.json.
--testConfigPath O caminho do arquivo de configuração de teste. Se não for especificado, o arquivo será pesquisado em \test no diretório atual do arquivo asaproj.json com o nome de arquivo padrãotestConfig.json.
--outputPath O caminho da pasta de saída do resultado do teste. Caso não seja especificado, os arquivos de resultado de saída serão colocados no diretório atual.
--customCodeZipFilePath O caminho do arquivo zip do código personalizado, como um UDF ou um desserializador, se eles forem usados. Você precisa empacotar as DLLs para o arquivo zip e especificar o caminho.

Se os casos de teste forem executados, você poderá encontrar um arquivo testResultSummary.json gerado na pasta de saída.

{
  "Total": (integer) total_number_of_test_cases,
  "Passed": (integer) number_of_passed_test_cases,
  "Failed": (integer) number_of_failed_test_cases,
  "Script": (string) absolute_path_to_asaql_file,
  "Results": [ (array) detailed_results_of_test_cases
    {
      "Name": (string) name_of_test_case,
      "Status": (integer) 0(passed)_or_1(failed),
      "Time": (string) time_span_of_running_test_case,
      "OutputMatched": [ (array) records_of_actual_outputs_equal_to_expected_outputs
        {
          "OutputAlias": (string) output_alias,
          "ExpectedOutput": (string) path_to_the_expected_output_file,
          "Output": (string) path_to_the_actual_output_file
        }
      ],
      "OutputNotEqual": [ (array) records_of_actual_outputs_not_equal_to_expected_outputs
        {
          "OutputAlias": (string) output_alias,
          "ExpectedOutput": (string) path_to_the_expected_output_file,
          "Output": (string) path_to_the_actual_output_file
        }
      ],
      "OutputMissing": [ (array) records_of_actual_outputs_missing
        {
          "OutputAlias": (string) output_alias,
          "ExpectedOutput": (string) path_to_the_expected_output_file,
          "Output": ""
        }
      ],
      "OutputUnexpected": [ (array) records_of_actual_outputs_unexpected
        {
          "OutputAlias": (string) output_alias,
          "ExpectedOutput": "",
          "Output": (string) path_to_the_actual_output_file
        }
      ],
      "OutputUnrequired": [ (array) records_of_actual_outputs_unrequired_to_be_checked
        {
          "OutputAlias": (string) output_alias,
          "ExpectedOutput": (string) path_to_the_expected_output_file,
          "Output": (string) path_to_the_actual_output_file
        }
      ]
    }
  ],
  "Time": (string) time_span_of_running_all_test_cases,
}

Observação

Se os resultados da consulta contiverem valores float, você poderá ter pequenas diferenças nos valores produzidos, levando a um teste provavelmente com falha. Isso se baseia nas diferentes estruturas do .Net que alimentam o Visual Studio ou o mecanismo do Visual Studio e no mecanismo de processamento de teste. Se quiser garantir que os testes sejam executados com êxito, você precisará diminuir a precisão dos valores produzidos ou alinhar os resultados para serem comparados manualmente com os resultados de teste gerados.

Implantar no Azure

Para implantar seu projeto do Stream Analytics usando modelos do ARM, siga estas etapas:

  1. Conecte-se à sua conta do Azure:

    # Connect to Azure
    Connect-AzAccount
    # Set the Azure subscription
    Set-AzContext [SubscriptionID/SubscriptionName]
    
  2. Implante seu projeto do Stream Analytics:

    $templateFile = ".\Deploy\ClickStream-Filter.JobTemplate.json"
    $parameterFile = ".\Deploy\ClickStream-Filter.JobTemplate.parameters.json"
    New-AzResourceGroupDeployment `
      -Name devenvironment `
      -ResourceGroupName myResourceGroupDev `
      -TemplateFile $templateFile `
      -TemplateParameterFile $parameterFile
    

Para obter mais informações sobre como implantar recursos com modelos do ARM, consulte Implantar com um arquivo de modelo Resource Manager e Azure PowerShell.

Próximas etapas