Alterações no código-fonte
Antes de iniciar as alterações no código-fonte é importante verificar se está na branch correta. Por padrão, os projetos no DevOps são criados da seguinte maneira:
Ambiente de aceite: branch test;
Ambiente de qualidade (QA): branch develop;
Ambiente de produção: branch master;
Também é possível que tenham sido criadas novas branches manualmente pelos desenvolvedores, de acordo com os padrões adotados no projeto.
No nosso exemplo utilizaremos a branch test, então verificaremos se o Git já está apontando para a Branch test, através do comando “git branch”:
Caso não esteja na branch correta, faça a alteração através do comando “git checkout [nome da branch]”:
Editando o código-fonte
Robôs e Integrações
O projeto é criado com a estrutura básica de uma aplicação Spring Boot, que utiliza o maven como gerenciador de dependências.
São criadas automaticamente duas classes Java:
Uma com o nome dado ao projeto, contendo as anotações @RobotModule, caso seja um robô, ou @IntegrationModule, caso seja uma integração Java. Também contém a anotação @Version, para controle de versão, e a anotação @Component, que indica que a classe é um componente Spring. Esta é a classe principal para o desenvolvimento do robô ou integração Java, da mesma forma como já é feito sem o DevOps. No caso do exemplo Roboexecutaratividade fica da seguinte forma:
package br.com.lecom.RoboExecutarAtividade;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import br.com.lecom.atos.servicos.annotation.Execution;
import br.com.lecom.atos.servicos.annotation.RobotModule;
import br.com.lecom.atos.servicos.annotation.Version;
@Component
@RobotModule("Roboexecutaratividade")
@Version({1,0,0})
public class Roboexecutaratividade {
private static final Logger LOGGER = LoggerFactory.getLogger(Roboexecutaratividade.class);
@Execution
public void execute() {
LOGGER.debug("Running robot");
}
}
A outra classe criada recebe o nome dado ao projeto + a palavra “Application”, que é a classe que executa o robô ou integração Java como uma aplicação Spring. No caso de exemplo RoboexecutaratividadeApplication fica da seguinte forma:
package br.com.lecom.RoboExecutarAtividade;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RoboexecutaratividadeApplication implements CommandLineRunner {
@Autowired
private Roboexecutaratividade RoboExecutarAtividade;
public static void main(String[] args) {
SpringApplication.run(RoboexecutaratividadeApplication.class, "--spring.profiles.active=test");
}
@Override
public void run(String...args) throws Exception {
RoboExecutarAtividade.execute();
}
}
Também é criado o arquivo pom.xml para gerenciamento de dependências através do maven, contendo a dependência da tag parent de acordo com o tipo de projeto: robot-parent para robôs e integration-parent para integrações java.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>RoboExecutarAtividade</artifactId>
<version>1.0.0</version>
<parent>
<groupId>br.com.lecom</groupId>
<artifactId>robot-parent</artifactId>
<version>1.0.1-RELEASE</version>
<relativePath />
<!-- lookup parent from repository -->
</parent>
<repositories>
<repository>
<id>lecom-nexus-snapshots</id>
<name>Lecom Snapshots</name>
<url>https://repo-store.lecom.com.br/repository/lecom-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>lecom-nexus-releases</id>
<name>Lecom Releases</name>
<url>https://repo-store.lecom.com.br/repository/lecom-releases</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
IMPORTANTE: A versão atual desta dependência é 1.0.1-RELEASE (utilizada no momento da escrita deste manual, em agosto/2023). A versão deve ser sempre observada, pois poderá evoluir ao longo do tempo.
Aplicação externa
O projeto é criado com a estrutura básica de uma aplicação Spring Boot, que utiliza o maven como gerenciador de dependências.
Diferente dos robôs e integrações Java, o projeto de aplicações vem com:
Uma classe com o nome dado ao projeto + a palavra “Application”, que é a classe que executa a aplicação como uma aplicação Spring. No caso de exemploAppexternasimplesApplication fica da seguinte forma:
Um pacote de Controller, já contendo o HealthRestController, que é um controller com uma rota simples, que pode ser utilizado para verificar se a aplicação está no ar:
Também é criado o arquivo pom.xml para gerenciamento de dependências através do maven, contendo a dependência da tag parent, que para aplicações é external-application-parent.
IMPORTANTE: Conforme descrito no Manual do usuário, as aplicações que forem publicadas via DevOps, terão sua URL base definidas a partir da URL do ambiente. Exemplo: https://cliente.com.br/app-ext/minhaaplicacao .
Então no caso da Appexternasimples, para acessarmos a rota do controller HealthRestController no ambiente http://plataforma.lecom.com.br , por exemplo, a URL seria: https://plataforma.lecom.com.br/app-ext/appexternasimples/api/v1/health.
Adicionando uma biblioteca pelo Maven
Para adicionar uma biblioteca ao projeto, basta adicionar a dependência ao arquivo pom.xml. Isso é válido para qualquer tipo de projeto: Robôs, Integrações Java e Aplicações.
Como exemplo, iremos adicionar a dependência Stella Core para validação de CPF à aplicação do tópico anterior.
Primeiro acessaremos o site https://mvnrepository.com/ onde é possível buscar por várias bibliotecas, buscaremos por “stella core”.
Ao selecionar a biblioteca, será exibida uma tabela de informações das versões. Selecionaremos a mais recente disponível, que na data da escrita deste manual é a 2.1.6.
Ao selecionar a versão, será exibida uma página com informações de como adicionar à dependência via Maven.
Devemos copiar o conteúdo do quadro, colar no arquivo pom.xml, dentro da tag <dependencies>, e salvar a alteração.
Em seguida clicar o botão direito no projeto, selecionar o menu “Maven > Update Project”.
Feito isso a dependência está pronta para ser utilizada. Criaremos a classe CpfValidatorController para exemplificar o uso.
IMPORTANTE: No caso de integrações e robôs (criados antes do projeto de isolamento), as bibliotecas adicionadas no arquivo pom.xml também precisam ser incluídas na pasta custom quando as mesmas não são utilizadas pela plataforma.
Caso a biblioteca já seja utilizada pela plataforma, essas customizações irão utilizar a mesma versão já disponibilizada no tomcat.
Isso é necessário porque estas customizações são executadas no mesmo contexto do tomcat e por isso, precisa ter acesso a essas bibliotecas.
Também é necessário garantir a compatibilidade das bibliotecas externas com a plataforma.
No caso das aplicações externas e robôs criados pelo projeto de isolamento, não é necessário adicionar as bibliotecas à pasta custom, pois estas customizações rodam em um contexto separado do tomcat da plataforma
Publicando alterações
Para consolidar as alterações feitas, é necessário fazer o commit no repositório.
Através do comando “git status” é possível visualizar os arquivos que foram alterados.
Adicionar os arquivos modificados ao staging do git através do comando “git add [nome do arquivo]” ou “git add .” para adicionar todos os arquivos.
Em seguida, utilize o comando “git commit -m “[mensagem de commit]” para consolidar o commit.
E para finalizar utilizar o comando “git push” para enviar as alterações ao repositório remoto.
Feito isso, as alterações já poderão ser publicadas no Studio, acessando o cadastro do robô e clicando no botão “Publicar”, conforme descrito no manual do usuário.
O processo é o mesmo para robôs, integrações Java e aplicações.