Рубрики
Uncategorized

Entrega Contínua: Análise de Código, яички, Build E Deploy Automatizado com Circleci & Градл

Nos últimos dias, inho etstudando sobre entrega contínua, e, durante esse processo acabei criando um … Tagged с учебником, программированием, DevOps, Braziliandevs.

Nos últimos dias, venho estudando sobre entrega contínua, e, durante esse processo acabei criando um pipeline no Qual eu vou compartilhar nesse post com Vocês:)

SE Você ainda não sabe o que é enga contínua clique Акми

O Que Será Abordado Nesse Post?

  • Análise Código (Bugs, Segurança e ulnerabilidades) utilizando sonarqube
  • Яички Unitários e de Integração rodando em paralelo para otimizar o Pipeline
  • Строитель
  • Развернуть Automático da aplicação no heroku
  • Teste de api após o развертывать

Ferramenta que eu estou utilizando como cd (entrega contínua) é o Circleci , Sendo Assim, Ela Que Eu Irei Mostrar os.

Circleci

É Uma plataforma de Integração e Entrega contínua (CICD) para sistemas operacionais como linux, macos e android e и т. Д., Totalmente em nuvem.

Разговор дешево, покажи мне код

Nosso Primeiro Passo é Criar как задачи № Градл para o teste UnitArio E Teste de Integração, Esso nos ajudara a separar o jass na execução do pipeline.

O Código Das Tasks ficará assim no arquivo build.gradle.kts:

tasks {
  create("unitTest", Test::class) {
        filter {
            includeTestsMatching("br.com.projeto.core.*")
        }
        testLogging {
            events(TestLogEvent.PASSED)
            events(TestLogEvent.FAILED)
        }
    }

create("integrationTest", Test::class) {
        filter {
            includeTestsMatching("integration.*")
        }
        testLogging {
            events(TestLogEvent.PASSED)
            events(TestLogEvent.FAILED)
        }
    }
}

Basicamente a task unitTest roda todos os testes que estão dentro do pacote `br.com.projeto.core.*`, já a task integrationTest como o próprio nome já diz, executa os testes de integração do pacote `integration.*`, as duas tasks tem como configuração o test logging mostrando os testes que passaram e que falharam.

Нет Meu Caso, эстратура Dos Pacotes de Testes do meu projeto essim:

test > kotlin > br.com.projeto.core (testes unitários)
test > kotlin > integration

Certo, Agora Que Temos Essas Duas Задачи, Podemos inclui-las no nosso arquivo config.yml Do Circleci que está no projeto:

  unit-test:
    working_directory: ~/
    docker:
      - image: circleci/openjdk:11-jdk-stretch-node-browsers
    steps:
      - checkout
      - run:
          name: Unit tests
          command: ./gradlew unitTest

  integration-test:
    working_directory: ~/
    machine: true
    environment:
      JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
      JAVA_TOOL_OPTIONS: "-Xmx4G"
      GRADLE_OPTS: "-Xmx4G -Dorg.gradle.daemon=false -DdisablePreDex"
    steps:
      - run:
          name: Download Java 11
          command: |
            sudo apt update
            sudo apt install openjdk-11-jdk
      - checkout
      - run:
          name: Integration tests
          command: ./gradlew integrationTest

workflows:
 'Test, Build and Deploy Workflow':
  jobs:
    - unit-test
    - integration-test

Nosso segundo passo, é configurar o Сонаркубе Нет projeto, para Que o Pipeline Foca O Загрузить DA ANálise Automaticamente No SonarCloud.

Сонаркубе

É Uma Ferramente Para Análise de Código, Sendo Osfory Analisar Qualidade de Código, Bugs e Ossíveis falhas de Segurança.

Dentro do arquivo build.gradle.kts éseyrio inserir o código abaixo:

plugins {
   id("org.sonarqube") version "3.0"
}

sonarqube {
    properties {
        property("sonar.projectKey", "chave do seu projeto")
        property("sonar.organization", "sua organizacao")
        property("sonar.host.url", "https://sonarcloud.io")
    }
}

Feito Esso, Agora precisamos adicionar o Иоваря без трубопровода, adicionando no arquivo config.yml:

Não se preocupe com o arquivo config.yml agora, vou deixar ele Нет финального пост: D

  code_analysis:
    docker:
      - image: circleci/openjdk:11-jdk-stretch-node-browsers
    steps:
      - checkout
      - run:
          name: Sonarqube analysis
          command: ./gradlew sonarqube

workflows:
 'Test, Build and Deploy Workflow':
  jobs:
    - unit-test
    - integration-test
    - code_analysis:
        requires:
           - unit-test
           - integration-test
        context: sonarqube

REPARE QUE NO JOB DE code_analysis Foi adicionado Тэг требует Que indica Que esse Job Sou Deve Ser Aressado Após OS JOBS-Test Entegration Test Test Terem Sido executos com sucesso, тег (контекст) [ https://circleci.com/docs/2.0/contexts/ ] indica Que o Работа девелотизар o контекст criado no circleci (Нет Caso sonarqube) utilizando как variaveis que foram defineidas nesse contexto.

CERTO, Agora Que adicionamos os яичет e a análise de código precisamos receart o build do projeto para que seja gerado o para para o развернуть da aplicação.

Vamos adicionar o Job Que Que Execure o Build:

   build:
    working_directory: ~/
    docker:
      - image: circleci/openjdk:11-jdk-stretch-node-browsers
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "build.gradle.kts" }}
            - v1-dependencies-
      - run:
          name: Run assemble
          command: ./gradlew clean assemble
      - save_cache:
          paths:
            - ~/.gradle
          key: v1-dependencies-{{ checksum "build.gradle.kts" }}

Agora que conseguimos fazer o build da nossa aplicação de forma Automatizada, Vamos para a proxima etapa, нет Caso o развертывание.

O Circleci Disponibiliza Орбы que de forma resumida, sãao pacotes с открытым исходным кодом Que reduzem Комплексное изображение de configururação para jobs criar, команды E Executors. Vamos utilizar a orb do Хероку PARA EXERATAR O развертывание.

version: 2.1

orbs:
  heroku: circleci/heroku@1.2.2
jobs:
   \* lista de jobs *\

workflows:
  'Test, Build and Deploy Workflow':
    jobs:
      - unit-test:
      - integration-test:
      - code_analysis:
          requires:
            - unit-test
            - integration-test
          context: sonarqube
      - build:
          requires:
            - unit-test
            - integration-test
      - heroku/deploy-via-git:
          requires:
            - build
          filters:
            branches:
              only: master

Não se esqueca de configurar o seu arquivo procfile do heroku:) нет meu caso ficou assim:

web: java -jar build/libs/projeto.jar -port=${PORT}

Com O Deploy Configurado, Temos A última etapa Que Seria o teste de api após o развертывание Para verificar se os endpoints da aplicação continuam funcionando corretamente (nesse amemplo, temos apenas ammiente, mase seria exempare os osemesestese demembente desemevom OU Petsing Antes развертывает Ser Areceadado Em Produção).

Para essa etapa, используйте orb do circleci chamada postman newman Нет Qual Lê Uma Collection.json de UM Deginado Path E Execure.

Como é Uma orb, Devemos adiciona-lá no arquivo config.yml

version: 2.1

orbs:
  heroku: circleci/heroku@1.2.2
  newman: postman/newman@0.0.2
jobs:
   \* lista de jobs *\

Агора Вамос Адиционар О.

 api-test:
    working_directory: ~/
    executor: newman/postman-newman-docker
    steps:
      - checkout
      - newman/newman-run:
          collection: postman/projeto-collection.json
          environment: postman/projeto-environment.json

Профридадская среда Contém A Url que foi gerada no heroku durante o развернут.

Нет финального o Pipeline Deve Ficar Dessa Forma нет Circleci:

Arquivo config.yml Завершите:

version: 2.1

orbs:
  newman: postman/newman@0.0.2
  heroku: circleci/heroku@1.2.2

jobs:
  unit-test:
    working_directory: ~/
    docker:
      - image: circleci/openjdk:11-jdk-stretch-node-browsers
    steps:
      - checkout
      - run:
          name: Unit tests
          command: ./gradlew unitTest

  integration-test:
    working_directory: ~/
    machine: true
    environment:
      JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
      JAVA_TOOL_OPTIONS: "-Xmx4G"
      GRADLE_OPTS: "-Xmx4G -Dorg.gradle.daemon=false -DdisablePreDex"
    steps:
      - run:
          name: Download Java 11
          command: |
            sudo apt update
            sudo apt install openjdk-11-jdk
      - checkout
      - run:
          name: Integration tests
          command: ./gradlew integrationTest
  code_analysis:
    docker:
      - image: circleci/openjdk:11-jdk-stretch-node-browsers
    steps:
      - checkout
      - run:
          name: Sonarqube analysis
          command: ./gradlew sonarqube

  build:
    working_directory: ~/
    machine: true
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "build.gradle.kts" }}
            - v1-dependencies-
      - run:
          name: Run assemble
          command: ./gradlew clean assemble
      - save_cache:
          paths:
            - ~/.gradle
          key: v1-dependencies-{{ checksum "build.gradle.kts" }}

  api-test:
    working_directory: ~/
    executor: newman/postman-newman-docker
    steps:
      - checkout
      - newman/newman-run:
          collection: postman/collection.json
          environment: postman/environment.json

workflows:
  'Test, Build and Deploy Workflow':
    jobs:
      - unit-test
      - integration-test
      - code_analysis:
          requires:
            - unit-test
            - integration-test
          context: sonarqube
      - build:
          requires:
            - unit-test
            - integration-test
      - heroku/deploy-via-git:
          requires:
            - build
          filters:
            branches:
              only: master
      - api-test:
          requires:
            - heroku/deploy-via-git

Arquivo build.gradle.kts opplo:

plugins {
    kotlin("jvm") version "1.3.61"
    id("org.sonarqube") version "3.0"
}

sonarqube {
    properties {
        property("sonar.projectKey", "chave do projeto"
        property("sonar.organization", "organization")
        property("sonar.host.url", "https://sonarcloud.io")
    }
}

tasks {
    create("stage", Task::class) {
        dependsOn("installDist")
    }

    create("unitTest", Test::class) {
        filter {
            includeTestsMatching("br.com.projeto.core.*")
        }
        testLogging {
            events(TestLogEvent.PASSED)
            events(TestLogEvent.FAILED)
        }
    }

    create("integrationTest", Test::class) {
        filter {
            includeTestsMatching("integration.*")
        }
        testLogging {
            events(TestLogEvent.PASSED)
            events(TestLogEvent.FAILED)
        }
    }

}

Esse foi apenas emembero do que é ous of -of fazer com o seu pipeline, exceedem vários wootros jobs que podem ser adicionados como lint, gerar documentação, яички для дыма, автоматическая

Espero Que esse post tenha te ajudado de alguma forma.

Muito obrigado por ler esse post, caso tenha ficado com alguma dúvida ou tenha alguma suestão, sinta-se livre para deixar um comentário 😀

Оригинал: «https://dev.to/vinigmoraes/entrega-continua-analise-de-codigo-testes-build-e-deploy-automatizado-com-circleci-gradle-4fl4»