SalesforceDX CI/CD Pipeline com jenkins

Se você chegou até aqui, provavelmente conhece CRM e o salesforce. Caso não seja o seu caso, vale uma pequena introdução.

CRM é um software/plataforma orientado a gerenciar as interações de uma organização com seus clientes. Existem diversos produtos do tipo e um dos mais famosos atualmente é o Salesforce.

No meu caso, eu nunca havia trabalhado com Salesforce, nem com a linguagem APEX, que é muito parecida com o java e é utilizada no desenvolvimento das soluções desta plataforma.

Recentemente precisei construir um pipeline CI/CD para que a equipe de salesforce pudesse ter acesso a versionamento e a outros benefícios. Se você não conhece o que é um pipeline CI/CD, sugiro procurar artigos sobre o assunto, pois é um tópico de devops que tem mudado bastante o processo de desenvolvimento. Um breve resumo de CI/CD seria:

CI – CONTINUOUS INTEGRATION

Prática de integrar seu codigo frequentemente a um repositorio de versionamento e que este processo acione uma trigger que após o checkin, sejam feitos testes de validação do código (teste unitário) e seja feito o build da aplicação.

CD – CONTINUOUS DELIVERY

É um passo seguinte ao CI, onde apos o build do projeto, automaticamente o pipeline aplica o build nos ambiente de staging, homologação e outros dependendo da sua estrutura.

Alguns artigos e livros separam o CD, em CONTINUOUS DEPLOY também, onde neste caso estamos fazendo referencia ao deploy em produção. Ou seja, cada check-in no versionador vai para produção. Logico que para isso precisam ser aplicadas algumas técnicasno pipeline, como canary release e feature flag, sem contar que é impossivel implantar um processo de CD, sem testes automatizados.

Se você é desenvolvedor java e quiser aprender mais sobre o assunto, indico fortemente o livro abaixo, pois ele explica detalhadamente a construção de um pipeline CI/CD em um cenário java e aborda profundamente diversos tópicos importantes.

A construção de um pipeline, não é uma tarefa simples, é trabalhoso, mas trata-se de um conjunto de configurações normalmente em torno de um builder, neste caso o Jenkins, que é a base de tudo que já estudei e implantei relacionado a este assunto. O grande diferencial neste caso é a integração com o salesforceDX, que utiliza um cliente próprio do salesforce para construção do que é chamado de scratchOrgs (porções menores de uma organização salesforce padrão).

Segua baixo o passo a passo da construção desta solução:

PASSO 1 – Configuração do GIT

  • Criar/copiar os fontes do projeto na pasta desejada. Como exemplo para esse tutorial, foram utilizado os fontes do repositório https://github.com/salesforce1development/sfdx-dreamhouse.git
  • Com os arquivos copiados para a pasta e com o prompt na raiz do projeto, executar o comando git init, que vai inicializar um repositório local do git para a pasta
  • executar o comando git add -A pra aplicar todos os arquivos da pasta em stage.
  • executar o comando git commit -m ‘start‘ para realizar o commit no repositório local.
  • os fontes contidos neste repositório são de exemplo, porem os arquivos “JenkinsFile” e “.gitignore” serão aproveitados nos projetos reais para configuração do pipeline
  • Configurado o repositório local, é necessário criar uma repositório remoto que pode ser criado no gitlab, github ou qualquer outro repositório git existente.
  • apos a criação do repositório, executar os comandos abaixo para realizar o commit remoto:
  • git remote add origin seu-repositorio.git
  • git push -u origin master
  • pode ser utilizado uma interface gráfica do git caso tenha preferencia.

PASSO 2 – Geração de certificado SSL

O pipeline CI/CD tem como um dos seus fundamentos, que ele deve operar sem a necessidade de ações de usuários. Para conseguir isso, a comunicação entre o pipeline e o salesforce é feita via token JWT e certificado. Abaixo seguem os comandos para geração do certificado que deve ser referente a maquina onde será instalado o jenkins (passo 5 mais a frente).

[cc lang=”bash”]
sudo openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
sudo openssl rsa -passin pass:x -in server.pass.key -out server.key
sudo openssl req -new -key server.key -out server.csr
sudo openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
[/cc]

No windows é necessário instalar o openSSL e criar uma variável de ambiente que aponte para o arquivo de configuração:

[cc lang=”powershell”]
set OPENSSL_CONF=”C:\Work\app\openssl-0.9.8h-1-bin\share\openssl.cnf”
[/cc]

PASSO 3 – Configuração do SalesforceDX

As informações abaixo estão descritas na visão lightning do salesforce.

No salesforce vamos criar um aplicativo utilizando o App Manager. O nome desse aplicativo é JenkinsAppDemo conforme imagem abaixo:

Nesta mesma tela, configuramos a integração com a aplicação utilizando o certificado gerado no passo 2. Certifique-se que a configuração do aplicativo tenha:

  • Habilitado o Oauth, 
  • O arquivo server.crt gerado no passo 2 tenha sido selecionado como arquivo de certificado
  • Configurado a url de callback para http://localhost:1717/OauthRedirect (pode utilizar outra porta, mas neste caso será necessário configurar o json da aplicação).
  • A opção Require Secret for Web Server Flow esteja marcada.
  • E as permissões estejam conforme a imagem

Apos as configurações acima, as informações devem ser salvas e o próximo passo é gerenciar as politicas do app.

  • acesse o app manager e selecione o aplicativo criado, selecione a opção “Manage” -> “Edit Polices”. Nesta tela a unica opção que deve ser modificada é Permitted Users que deve ter a opção Admin approved users are pre-authorized

O ultimo passo de configuração do salesforce é modificar o profile do usuário de sistema. No menu a esquerda selecionar “Users” -> “Profiles” -> clique no link System Administrator -> clique em edit

marque a opção para permitir acesso do sys admin ao aplicativo que foi criado e clique em save.

pronto, a configuração do aplicativo no salesforce já foi finalizada.

PASSO 4 – Instalação node, npm, git e sfdx.

O ambiente de integração com o salesforce precisa que seja instalado o cliente sfdx, responsavel por realizar as chamadas ao salesforce para completar a execução do pipeline. A instalação deste comando é feita utilizando o npm, que é o gerenciador de pacotes do nodejs.

instalando o nodejs (ultima versão LTS, neste momento, 10.14.2)
https://nodejs.org/en/

instalando o git
https://git-scm.com/

instalando o sfdx
npm install –global sfdx-cli

PASSO 5 – Configuração do Jenkins

Para configurar um ambiente de CI/CD é necessário um orquestrador. É ele quem vai apos o push no git, realizar o build, rodar os códigos de teste e realizar a integração com o org scratch do salesforce. No nosso caso este orquestrador é o Jenkins.

A instalação do jenkins é bastante intuitiva, siga a instalação apos realizar o download no site, é bastante intuitivo.

Apos a instalação, verifique se existe uma jvm em execução na maquina utilizando o comando “java -version”. Caso não tenha será necessário instalar. Deve ser utilizada uma versao do java igual ou superior a versão 8:

apos a confirmação da instalação do java, acesse o jenkins na url http://localhost:8080

No windows o jenkins executa como um serviço do windows com o nome “jenkins”

No primeiro acesso, será apresentado um logo seguido de uma tela para que você informe a chave pra habilitar o jenkins.

Siga as instruções na tela e obtenha a chave no caminho informado. Apos informa-la será necessário configurar os plugins

Selecione a opção da direita, e selecione alem das opções, default, os plugins gitlab, github e git parameter:

apos iniciar a instalação, será apresentada a seguinte tela:

neste momento, a instalação vai demorar um pouco e apos finalizar você será direcionado para a home do jenkins.

com o jenkins instalado, o próximo passo é configurar a credencial de acesso utilizando o certificado gerado no passo 2. Como o certificado foi configurado no app manager do salesforce e será configurado no jenkins, as duas aplicações poderão se comunicar utilizando o certificado como meio de autenticação.

No jenkins, acesse Credentials -> System -> Global Credentials -> Add Credentials

na tela de configuração de credentials, selecione secret file e escolha a secret key gerada no passo 2 em conjunto com o certificado.

apos gravar a credential, clique em update para retornar a tela de edição da credential, agora será exibido um ID, guarde esse ID, pois ele será utilizado na configuração do pipeline.
ID: 5e5b15f1-14ac-40b2-95ab-d4ea6018786a

External Tool – SFDX

No passo 4 instalamos o sfdx, que é o client do salesforceDX. Agora é necessario configurar o jenkins para que ele possa executar o comando internamente. Para isso, precisamos configurar o plugin external tool. Clique em Manage Jenkins -> Manage Plugins. Selecione a aba available e busque no filtro por “custom”. Marque a opção Custom Tools e clique em Install without Restart

obs.: não é necessário reinicializar o jenkins.
com o plugin instalado, vamos configurar o comando sfdx. Clique em Manage Jenkins -> Global Tool Configuration -> Add Custom Tool. Informe o nome do comando como toolbelt (se for mudar o nome, ele deve ser modificado no arquivo JenkinsFile do projeto) e informe o caminho completo do comando de execução em Installation directory

ignore o warning onde o jenkins informa que o caminho do comando não é um diretório, estamos setando como toolbelt o comando sfdx e não o seu diretório.

Variáveis de ambiente

Para executar o comando sfdx, é necessário alguns parâmetros que serão gravados nas variáveis de ambiente do jenkins. Acesse Manage Jenkins -> Configure System, em global properties, marque a checkbox  Environment variables e preencha as variáveis conforme abaixo:

  • HUB_ORG_DH – é o seu e-mail de acesso ao salesforce, o login para o seu hub
  • SFDC_HOST_DH – url para autenticação no salesforce, este valor deve ser fixo como https://login.salesforce.com
  • CONNECTED_APP_CONSUMER_KEY_DH – consumer key do aplicativo que foi criado
  • JWT_CRED_ID_DH – id da credencial criado no jenkins utilizando o certificado (aquele mesmo código que foi informado que seria utilizado posteriormente)

onde encontrar o consumer key:

Repositório GIT

A partir desse ponto finalizamos as configurações do ambiente e vamos instalar o pipeline integrado com o git e salesforce. Clique em New Item e informe o nome da aplicação (AplicacaoDX) e selecione Multibranch Pipeline.

Apos clicar em ok, tive um problema com o loading que não terminava para o pipeline, foi necessario reiniciar o jenkins e o processo voltou ao normal.

Com o pipeline criado, vamos integrar o git ao pipeline. Acesse My Views -> AplicacaoDX -> Configure. Selecione a aba Branch Sources e escolha a opção single repository & branch. Neste ponto configure o repositório e clique em save

pronto com isso finalizamos a configuração do pipeline, no momento o pipeline está realizando as seguintes ações:

  • baixa a ultima versao do repositorio git configurado
  • executa os testes unitarios
  • compila o pacote
  • cria o scratch org do pacote
  • aplica o pacote no scratch org criado

PASSO 6 – build do projeto

Para realizar o build de um pacote, acesse My Views -> AplicacaoDX -> AplicacaoDXSource -> Build Now. Ao finalizar o build, o resultado será mostrado em azul sinalizando sucesso no processo (no caso abaixo, o build #10, que foi o ultimo executado, os anteriores apresentaram erro)

para visualizart o scratch criado, execute o comando abaixo no prompt utilizando o sfdx client pra abrir o seu dev hub:
sfdx force:org:open -u[login]
este comando vai abrir uma janela no navegador para o seu dev hub:

clicando em Active Scratch Orgs, será apresentada a lista de cada scratch criado

Desenvolvimento salesforceDX
O que muda?

  • O desenvolvimento passa a ser feito em sua maquina, utilizando o editor de sua preferencia
  • O seu código passa ser versionado no git e com o pipeline construído no inicio deste documento, é possível gerar os builds e integra-los diretamente ao ambiente de stage e produção.
  • integração total com o visual studio code.

Scratch Orgs

Um scratch org é um “emulador” de salesforce onde é possível simular um ambiente com diferentes recursos e preferencias, assim como a versão do salesforce que é utilizada. 

cada scratch org é uma instancia do salesforce, e existe um limite para cria-las conforme o quadro abaixo:

para ver o limite da sua conta, execute o seguinte o comando:
sfdx force:limits:api:display -u <Dev Hub username or alias>

Então pessoal, é isso, caso tenham alguma duvida sobre o pipeline só mandar, já sobre o salesforce, não é muito a minha praia e indico esse site aqui caso busquem informações sobre o assunto.

Related Posts

Carreiras: Desenvolvedor CRM SalesForce
× Como posso te ajudar?