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.