Artigo
· Abr. 4, 2023 8min de leitura

Entrega contínua de sua solução InterSystems usando GitLab – Parte X: Além do código

Após uma pausa de quase quatro anos, minha série sobre CI/CD está de volta! Ao longo dos anos, trabalhei com vários clientes da InterSystems, desenvolvendo pipelines de CI/CD para diferentes casos de uso. Espero que as informações apresentadas neste artigo sejam úteis para alguém.

Esta série de artigos discute várias abordagens possíveis para o desenvolvimento de software com tecnologias da InterSystems e do GitLab.

Temos uma variedade interessante de tópicos para abordar: hoje, vamos falar sobre elementos fora do código — ou seja, configurações e dados.

Problema

Anteriormente, discutimos promoções de código e, de certa forma, sem estado — sempre passamos de uma instância (presumivelmente) vazia para uma codebase completa. No entanto, às vezes, precisamos fornecer dados ou estado. Há diferentes tipos de dados:

  • Configuração: usuários, web apps, LUTs, esquemas personalizados, tarefas, parceiros de negócios e muito mais
  • Configurações: pares de chaves-valor específicas ao ambiente
  • Dados: com frequência, tabelas de referência precisam ser fornecidas para seu app funcionar

Vamos discutir todos esses tipos de dados e como eles podem ser adicionados primeiro ao controle de fonte e posteriormente implantados.

Configuração

A configuração do sistema é dividida em muitas classes diferentes, mas o InterSystems IRIS pode exportar a maioria delas para XMLs. Primeiro, um Pacote de segurança contém informações sobre:

  • Web Apps
  • DocDBs
  • Domínios
  • Eventos de auditoria
  • Servidores KMIP
  • Configurações LDAP
  • Recursos
  • Funções
  • Privilégios SQL
  • Configurações SSL
  • Serviços
  • Usuários

Todas essas classes fornecem métodos Exists, Export e Import, permitindo movê-las entre ambientes.

Algumas ressalvas:

  • Os usuários e as configurações de SSL podem conter informações confidenciais, como senhas. Geralmente, NÃO é recomendado armazená-los no controle de fonte por motivos de segurança. Use os métodos Export/Import para facilitar transferências únicas.
  • Por padrão, os métodos Export/Import geram os resultados em um arquivo, o que talvez não seja compatível com o controle de fonte. Veja uma classe de utilitário que pode exportar e importar Tabelas Lookup, Esquemas Personalizados, Parceiros de Negócio, Tarefas, Credenciais e Configuração SSL. Ela exporta um item por arquivo, então você obtém um diretório com LUT, outro diretório com esquemas personalizados e assim por diante. Para configurações SSL, ela também exporta arquivos: certificados e chaves.

Também vale a pena notar que, em vez de importar/exportar, você pode usar %Installer ou Mesclagem CPF para criar a maioria desses elementos. Ambas as ferramentas também são compatíveis com a criação de namespaces e bancos de dados. A Mesclagem CPF pode ajustar as configurações do sistema, como o tamanho do buffer global.

Tarefas

A classe %SYS.Task armazena tarefas e fornece métodos ExportTasks e ImportTasks. Você também pode verificar a classe de utilitário acima para importar e exportar tarefas uma a uma. Observe que, ao importar tarefas, você pode obter erros de importação (ERROR #7432: Start Date and Time must be after the current date and time - A data e o horário de início precisam ser posteriores à data e ao horário atual) se StartDate ou outras propriedades relacionadas à programação estiverem no passado. Como solução, defina LastSchedule como 0 para o InterSystems IRIS reprogramar uma tarefa recém-importada para ser executada em um futuro próximo.

Interoperabilidade

As produções de interoperabilidade contêm:

  • Parceiros de negócio
  • Configurações Padrão do Sistema
  • Credenciais
  • Tabelas Lookup

Os dois primeiros estão disponíveis no pacote Ens.Config com métodos %Export e %Import. Exporte Credenciais e Tabelas Lookup usando a classe de utilitário acima. Em versões recentes, Tabelas Lookup podem ser exportadas/importadas pela classe $system.OBJ.

Configurações

Configurações Padrão de Sistema - é um mecanismo de interoperabilidade padrão para configurações específicas ao ambiente:

A finalidade das configurações padrão do sistema é simplificar o processo de cópia de uma definição de produção de um ambiente para outro. Em qualquer produção, os valores de algumas configurações são determinados como parte do design de produção. Geralmente, essas configurações são as mesmas em todos os ambientes. Outras configurações, no entanto, precisam ser ajustadas ao ambiente. Essas configurações incluem caminhos de arquivo, números de portas e assim por diante.

As configurações padrão do sistema precisam especificar apenas os valores do ambiente em que o InterSystems IRIS está instalado. Por outro lado, a definição da produção precisa especificar valores de configurações que devem ser iguais em todos os ambientes.

Recomendo usá-los em ambientes de produção. Use %Export e %Import para transferir as configurações padrão do sistema.

Configurações do aplicativo

Seu aplicativo provavelmente também usa configurações. Nesse caso, recomendo usar as Configurações Padrão do Sistema. Embora seja um mecanismo de interoperabilidade, as configurações podem ser acessadas via: %GetSetting(pProductionName, pItemName, pHostClassName, pTargetType, pSettingName, Output pValue) (documentos). Você pode escrever um wrapper para definir os padrões com que você não se importa, por exemplo:

ClassMethod GetSetting(name, Output value) As %Boolean [Codemode=expression]
{
##class(Ens.Config.DefaultSettings).%GetSetting("myAppName", "default", "default", , name, .value)
}

Se você quiser mais categorias, você também pode expor argumentos pItemName e/ou pHostClassName. As configurações podem ser definidas inicialmente ao importar, usar o Portal de Gerenciamento de Sistema, criar objetos da classe Ens.Config.DefaultSettings ou definir ^Ens.Config.DefaultSettingsD como global.

Meu principal conselho aqui seria manter as configurações em um só lugar (pode ser as Configurações Padrão do Sistema ou uma solução personalizada), e o aplicativo precisa obter as configurações usando apenas a API fornecida. Dessa forma, o próprio aplicativo não conhece o ambiente e o que resta é fornecer um armazenamento centralizado de configurações com valores específicos ao ambiente. Para isso, crie uma pasta de configurações no seu repositório contendo arquivos de configuração com nomes iguais aos das ramificações do ambiente. Em seguida, durante a fase do CI/CD, use a variável de ambiente $CI_COMMIT_BRANCH para carregar o arquivo correto.

DEV.xml
TEST.xml
PROD.xml

Se você tiver vários arquivos de configurações por ambiente, use pastas com nomes de ramificações de ambiente. Para obter o valor da variável de ambiente de dentro do InterSystems IRIS, use $System.Util.GetEnviron("name").

Dados

Se você quiser disponibilizar dados (tabelas de referência, catálogos, etc.), há várias formas de fazer isso:

  • Exportação global. Use uma exportação GOF binária ou uma nova exportação XML. Com a exportação GOF, lembre-se de que os locais nos sistemas de origem e destino precisam corresponder (ou pelo menos a ordenação global precisa estar disponível no sistema de destino). A exportação XML ocupa mais espaço. Você pode melhorar isso ao exportar o global para um arquivo xml.gz, os métodos $system.OBJ automaticamente (des)arquivam os arquivos xml.gz conforme necessário. A principal desvantagem dessa abordagem é que os dados não são legíveis por humanos, nem mesmo o XML — a maioria é codificado em base64.
  • CSV. Faça a exportação CSV e importe com LOAD DATA. Prefiro o CSV, pois é o formato legível por humanos com armazenamento mais eficiente, que pode ser importado por qualquer coisa.
  • JSON. Crie uma classe habilitada para JSON.
  • XML. Crie uma classe habilitada para XML para projetar objetos no XML. Use se os dados tiverem uma estrutura complexa.

O formato que você deve escolher depende do seu caso de uso. Listei aqui os formatos na ordem de eficiência de armazenamento, mas essa não é uma preocupação se você não tiver muitos dados.

Conclusões

O estado adiciona complexidade aos seus pipelines de implantação de CI/CD, mas o InterSystems IRIS fornece uma vasta gama de ferramentas para gerenciá-lo.

Links

Discussão (0)2
Entre ou crie uma conta para continuar