Упражнение. Добавление заданий анализа и проверки кода в рабочий процесс

Завершено

Вы выступили с командой и решили автоматизировать развертывания с помощью рабочего процесса. Вы хотите повысить степень надежности при развертывании.

В этом упражнении вы добавите задания проверки в рабочий процесс. Затем вы будете запускать анализатор кода и предварительную проверку перед каждым развертыванием.

Во время процесса выполняются следующие задачи:

  • Обновите существующий рабочий процесс, чтобы добавить два новых задания для анализа и проверки кода Bicep.
  • Запустите рабочий процесс.
  • Исправьте все проблемы, обнаруженные рабочим процессом.

Добавление заданий анализа и проверки кода в рабочий процесс

  1. В Visual Studio Code откройте файл workflow.yml в папке .github/workflows.

  2. В разделе env: измените значение переменной AZURE_RESOURCEGROUP_NAME на ToyWebsiteTest:

    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
  3. Под строкой jobs: над заданием deploy добавьте новое задание анализа кода:

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    

    Это задание определяет шаг для извлечения кода и шаг, который запускает команду az bicep build для анализа файла Bicep.

    Совет

    YAML-файлы чувствительны к отступу. При вводе или вставке этого кода убедитесь, что выбран правильный отступ. Далее в этом упражнении вы увидите определение полного рабочего процесса YAML и проверите, соответствует ли ваш файл ему.

  4. Под только что добавленными строками и над заданием развертывания добавьте задание проверки:

    validate:
      runs-on: ubuntu-latest
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Run preflight validation
        with:
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
          deploymentMode: Validate
    

    Это задание определяет шаги для извлечения кода, входа в среду Azure и использования действия azure/arm-deploy в режиме развертывания Validate.

    Определение рабочего процесса теперь содержит три задания. Первое анализирует файл Bicep, второе выполняет предварительную проверку, а третье — развертывание в Azure.

  5. Под строкой runs-on в задании deploy добавьте оператор needs:

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
    

    Оператор needs указывает, что задание развертывания зависит от успешного завершения заданий анализа и проверки.

    Также обратите внимание, что задания проверки и развертывания выполняют вход в Azure, и все задания извлекают код из репозитория. Эти действия необходимы, так как каждое задание использует новый модуль выполнения GitHub.

  6. Сохраните файл.

Настройка анализатора кода

По умолчанию анализатор кода Bicep выдает предупреждение при обнаружении проблемы с файлом. GitHub Actions не обрабатывает предупреждения анализатора кода как проблемы, которые должны прерывать рабочий процесс. Чтобы настроить это поведение, создайте файл bicepconfig.json, который изменит конфигурацию анализатора кода.

  1. Добавьте новый файл в папку deploy и присвойте ему имя bicepconfig.json.

    Снимок экрана: Visual Studio Code Explorer с новым файлом, отображаемым в папке deploy.

  2. Скопируйте и вставьте в файл следующий код:

    {
      "analyzers": {
        "core": {
          "enabled": true,
          "verbose": true,
          "rules": {
            "adminusername-should-not-be-literal": {
              "level": "error"
            },
            "max-outputs": {
              "level": "error"
            },
            "max-params": {
              "level": "error"
            },
            "max-resources": {
              "level": "error"
            },
            "max-variables": {
              "level": "error"
            },
            "no-hardcoded-env-urls": {
              "level": "error"
            },
            "no-unnecessary-dependson": {
              "level": "error"
            },
            "no-unused-params": {
              "level": "error"
            },
            "no-unused-vars": {
              "level": "error"
            },
            "outputs-should-not-contain-secrets": {
              "level": "error"
            },
            "prefer-interpolation": {
              "level": "error"
            },
            "secure-parameter-default": {
              "level": "error"
            },
            "simplify-interpolation": {
              "level": "error"
            },
            "protect-commandtoexecute-secrets": {
              "level": "error"
            },
            "use-stable-vm-image": {
              "level": "error"
            }
          }
        }
      }
    }
    
  3. Сохраните файл.

Настройка взаимодействия задания развертывания с анализатором кода

При использовании пользовательской конфигурации linterp Bicep записывает данные журнала, которые GitHub Actions интерпретирует как ошибку. Чтобы отключить это поведение, настройте задачу arm-deploy таким образом, чтобы она игнорировала поток журнала стандартных ошибок (stderr).

  1. Откройте файл workflow.yml.

  2. На шаге теста Развернуть веб-сайт задания deploy установите для свойства failOnStdErr значение false:

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, validate]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        name: Deploy website
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
          template: ./deploy/main.bicep
          parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    
  3. Сохраните файл.

Проверка и фиксация определения рабочего процесса

  1. Убедитесь, что файл workflow.yml выглядит следующим образом:

    name: deploy-toy-website-test
    concurrency: toy-company
    
    on:
      push:
        branches:
          - main
    
    permissions:
      id-token: write
      contents: read
    
    env:
      AZURE_RESOURCEGROUP_NAME: ToyWebsiteTest
      ENVIRONMENT_TYPE: Test
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file deploy/main.bicep
    
      validate:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Run preflight validation
          with:
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
            deploymentMode: Validate
    
      deploy:
        runs-on: ubuntu-latest
        needs: [lint, validate]
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - uses: azure/arm-deploy@v1
          name: Deploy website
          with:
            failOnStdErr: false
            deploymentName: ${{ github.run_number }}
            resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
            template: ./deploy/main.bicep
            parameters: environmentType=${{ env.ENVIRONMENT_TYPE }}
    

    Если файл выглядит иначе, обновите его в соответствии с этим примером, а затем сохраните его.

  2. Зафиксируйте и отправьте изменения в репозиторий Git, выполнив следующие команды в терминале Visual Studio Code:

    git add .
    git commit -m "Add lint and validation jobs"
    git push
    
  3. Эта фиксация впервые была отправлена в этот репозиторий, поэтому вам может потребоваться войти в систему.

    В Windows введите 1 для проверки подлинности с помощью веб-браузера и нажмите клавишу ВВОД.

    В macOS нажмите Авторизовать.

  4. Откроется окно браузера. Возможно, потребуется еще раз выполнить вход в GitHub. Выберите Разрешить.

    Сразу после отправки GitHub Actions запускает новый рабочий процесс.

Просмотр запуска рабочего процесса

  1. В браузере перейдите к Actions.

    При первом запуске рабочего процесса с меткой Начальная фиксация отображается ошибка. GitHub автоматически запустил рабочий процесс при создании репозитория. Произошел сбой, так как секреты пока не были готовы. Этот сбой можно проигнорировать.

  2. Выберите последнее выполнение рабочего процесса.

    Снимок экрана: GitHub Actions с выделенной ссылкой на последний выполненный рабочий процесс.

    Обратите внимание, что в рабочем процессе теперь отображаются три задания, определенные в файле YAML. Задания анализа кода и проверки выполняются параллельно перед запуском задания развертывания.

  3. Если рабочий процесс по-прежнему запущен, дождитесь завершения. Хотя рабочие процессы автоматически обновляют страницу с учетом последнего состояния, рекомендуется периодически обновлять страницу.

    Обратите внимание, что сбой заданий при lint и проверке .

    Снимок экрана: запуск рабочего процесса в GitHub Actions с сообщением о сбое заданий анализа кода и проверки.

  4. Выберите задание анализа кода, чтобы просмотреть сведения о нем.

  5. Чтобы просмотреть журнал рабочего процесса, выберите шаг Запустить анализатор кода Bicep.

    Снимок экрана: журнал рабочего процесса для задания анализа кода с выделенным шагом для запуска анализатора кода Bicep.

    Ошибка в журнале рабочего процесса содержит сообщение об ошибке linter:

    Error no-unused-params: Parameter "storageAccountNameParam" is declared but never used.
    

    Это сообщение об ошибке указывает, что linter обнаружил нарушение правила в файле Bicep.

Исправление ошибки анализатора кода

Теперь, когда вы определили проблему, ее можно исправить в файле Bicep.

  1. В Visual Studio Code откройте файл main.bicep в папке deploy.

  2. Обратите внимание, что Bicep linter также обнаружил, что storageAccountNameParam параметр не используется. В Visual Studio Code под параметром отображается строка с волнистой линией. Как правило, линия будет желтой, чтобы показать предупреждение. Но поскольку вы внесли изменения в файл bicepconfig.json, анализатор кода будет обрабатывать код как ошибку и линия будет красной.

    param storageAccountNameParam string = uniqueString(resourceGroup().id)
    
  3. Удалите параметр storageAccountNameParam.

  4. Сохраните файл.

  5. Зафиксируйте и отправьте изменения в репозиторий Git, выполнив следующие команды в терминале Visual Studio Code:

    git add .
    git commit -m "Remove unused parameter"
    git push
    

    И снова GitHub Actions автоматически активирует новый запуск рабочего процесса.

Повторный просмотр запуска рабочего процесса

  1. В браузере перейдите к рабочему процессу.

  2. Выберите последний запуск.

    Дождитесь завершения выполнения рабочего процесса. Хотя GitHub Actions автоматически обновляет страницу с учетом последнего состояния, рекомендуется периодически обновлять страницу.

  3. Обратите внимание, что задание анализа кода успешно завершено, но задание проверки все еще не выполняется.

    Снимок экрана: запуск рабочего процесса, задание анализа кода выполнено успешно, а задание проверки завершилось сбоем.

  4. Выберите задание проверки, чтобы просмотреть сведения о нем.

  5. Выберите шаг Выполнить предварительную проверку, чтобы просмотреть журнал рабочего процесса.

    Снимок экрана: журнал рабочего процесса для задания проверки с выделенным шагом для выполнения предварительной проверки.

    Ошибка, отображаемая в журнале рабочего процесса, содержит следующее сообщение:

    mystorageresourceNameSuffix is not a valid storage account name. Storage account name must be between 3 and 24 characters in length and use numbers and lower-case letters only.
    

    Это означает, что имя учетной записи хранения недопустимо.

Исправление ошибки проверки

Вы обнаружили еще одну проблему в файле Bicep. Здесь вы исправляете ее.

  1. В Visual Studio Code откройте файл main.bicep в папке deploy.

  2. Взгляните на определение переменной storageAccountName:

    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website'
    var logAnalyticsWorkspaceName = 'workspace-${resourceNameSuffix}'
    var applicationInsightsName = 'toywebsite'
    var storageAccountName = 'mystorageresourceNameSuffix'
    

    Кажется, есть опечатка, и интерполяция строк не настроена правильно.

  3. Обновите переменную storageAccountName, чтобы правильно использовать интерполяцию строк:

    var storageAccountName = 'mystorage${resourceNameSuffix}'
    
  4. Сохраните файл.

  5. Зафиксируйте и отправьте изменения в репозиторий Git, выполнив следующие команды в терминале Visual Studio Code:

    git add .
    git commit -m "Fix string interpolation"
    git push
    

Просмотр успешного выполнения рабочего процесса

  1. В браузере перейдите к рабочему процессу.

  2. Выберите последний запуск.

    Дождитесь завершения выполнения рабочего процесса. Хотя GitHub Actions автоматически обновляет страницу с учетом последнего состояния, рекомендуется периодически обновлять страницу.

  3. Обратите внимание, что все три задания в рабочем процессе успешно завершены:

    Снимок экрана: запуск рабочего процесса в GitHub Actions, все три задания выполнены успешно.

    Некоторые предупреждения перечислены на панели Примечания. Эти предупреждения отображаются из-за того, как Bicep записывает информационные сообщения в журнал рабочего процесса. Вы можете игнорировать эти предупреждения.

Теперь у вас есть рабочий процесс, который успешно обнаруживает ошибки в коде Bicep на ранних этапах процесса развертывания, а затем выполняет развертывание в Azure, если ошибок нет.