Use SIL ao máximo

Olá a todos!

Neste artigo, eu gostaria de falar sobre o SIL novamente . Todos sabemos que o SIL possui um grande número de funções que facilitam muito a automação de nossas ações no Atlassian Jira and Confluence.

Escrevemos scripts SIL no item de menu do SIL Manager e a maioria de nós não presta atenção ao restante dos itens de menu. Estou falando desses itens de menu:



neste artigo, examinarei cada item de menu e mostrarei o que você pode obter de cada item.

Também quero observar que agora estamos falando sobre o mecanismo SIL , o que significa que todos esses recursos estão disponíveis gratuitamente.

Uso de campo personalizado


Este menu fornece informações sobre como cada campo personalizado é usado na sua instância do Jira. Informações do fornecedor podem ser encontradas aqui .
Você pode ver todos os campos no seu Jira se você acessar a engrenagem -> Edições -> Campos personalizados.



É assim que a tela se aparece no menu Uso de campo personalizado:



Como você pode ver, você pode selecionar qualquer campo personalizado e obter informações sobre ele. Para filtrar os campos disponíveis, basta começar a digitar os caracteres e a lista de campos personalizados será filtrada por esses caracteres.



Depois de ver seu campo, clique nele:



Você pode ver as seguintes informações neste campo:

  • Aliases de Sil
  • Telas e projetos nos quais o campo é usado.
  • Números de linha de scripts nos quais esse campo é usado.

No momento da redação deste documento, existe um bug CADS-6237 , que informa que as informações sobre o uso do campo em scripts não são exibidas na tela. Do jeito que é. Eu tenho essa informação porque modifiquei o código.

Configuração da página de redirecionamento


Esta opção permite gerenciar de forma inteligente o redirecionamento para páginas no Jira. Você pode encontrar informações do fornecedor aqui . Para dizer a verdade, levei horas para entender por que essa opção era necessária e como usá-la, portanto, explicarei essa opção com um exemplo.
Aqui está um exemplo.

Suponha que em nosso Jira, todo funcionário todo mês insira uma fatura por receber dinheiro na forma de um ingresso no projeto INV.



Como você pode ver, Alexey Matveev abriu duas contas para março e abril.

Mas o departamento de pessoal não funciona em Jira, mas em algum sistema externo, e eles têm uma página nesse sistema externo para cada funcionário com um link em Jira, o que leva ao ticket do funcionário com a última conta.

Como será esse link?

Claro, podemos fazer o link assimhttp: // localhost: 2990 / jira / browse / INV-2 . Mas INV-2 será a última pontuação de abril. Em maio, haverá um ingresso com uma conta diferente. Poderíamos alterar o link todos os meses na página de um funcionário do departamento de pessoal, mas isso é muito complicado. Algo mais simples é necessário.

E apenas a Redirect Page Configuration vem em nosso auxílio.

Vamos configurar.

Em nosso sistema de departamento de RH, o link ficará assim:

http://localhost:2990/jira/plugins/servlet/kredi?userName=Alexey+Matveev

Não estamos nos referindo a um ticket, mas ao plugins / servlet / kredi servlet, que redirecionará o ticket que precisamos. Passaremos o nome de usuário completo como parâmetro e, com base nesse parâmetro, nosso servlet será redirecionado para o ticket desejado.
Fizemos o link, agora precisamos fazer a lógica. E apenas fazemos a lógica no menu Redirect Page Configuration. Abra o menu e digite o seguinte código:

string userName = argv["userName"];

if (isNull(userName)) {
    return "/plugins/servlet/kredierror?customErrorTitle=User Not Provided&customErrorMessage=Provide user with userName parameter";
}
if (isNull(getUserByFullName(userName))) {
    return "/plugins/servlet/kredierror?customErrorTitle=User Not Found&customErrorMessage=User " + userName + " not found";
}
string [] k = selectIssues("project = INV and reporter = " + getUserByFullName(userName).username + " order by \"Invoice Date\" desc");
if (size(k) == 0) {
   return "/plugins/servlet/kredierror?customErrorTitle=Invoice Not Found&customErrorMessage=No invoices for "+ userName; 
}
return "/browse/" + k[0];

O código faz o seguinte:

  • obtemos o valor do parâmetro userName, que contém o nome completo do usuário.
  • verificamos se o parâmetro é passado, se não for passado, redirecionamos para a página de erro.
  • verificamos se o usuário com esse nome completo está conectado ao Jira. Caso contrário, redirecione para a página de erro.
  • selecione o último ticket com uma conta para esse usuário. Se nenhum ticket for encontrado, redirecionaremos para a página de erro.
  • faça um redirecionamento para o ticket com a última contagem.

Agora verifica!

Primeiro, criaremos esse link e clicaremos nele:

http://localhost:2990/jira/plugins/servlet/kredi?userName=Alexey+Matveev
Veremos uma tela assim:

Está certo! Esta é a minha última contagem.
Agora não passaremos o usuário como parâmetro:

http://localhost:2990/jira/plugins/servlet/kredi

E recebemos uma página de erro:

Isso mesmo!
Agora vamos passar um usuário que não está no Jira:

http://localhost:2990/jira/plugins/servlet/kredi?userName=Super+Man

Vimos uma página com um erro:



Novamente, tudo é verdade!

E agora transferiremos o usuário que não criou um único ticket com uma conta:

http://localhost:2990/jira/plugins/servlet/kredi?userName=Tomas+Brook

E recebemos uma página com um erro:



Tudo funciona corretamente!

Assim, trouxemos toda a lógica de redirecionamento para a página correta no Jira. E é muito conveniente, portanto, neste caso, escrevemos toda a lógica no SIL, o que é muito mais fácil do que escrever a mesma lógica em um sistema externo.

Mudar de utilizador


Este item de menu permite que o administrador trabalhe com qualquer usuário registrado no Jira sem saber a senha desse usuário. Você pode ler as informações do fornecedor aqui .

Isso é necessário, por exemplo, quando um usuário diz que Jira está se comportando incorretamente e o administrador não pode reproduzi-lo. Nesse caso, o administrador pode efetuar login no Jira como esse usuário e ver o que acontece.



Para encontrar rapidamente o usuário que você precisa, basta começar a digitar os caracteres que estão no nome desse usuário, e a lista será filtrada por esses caracteres:



Selecione o usuário desejado e clique no botão Alternar!

Para fazer login novamente com seu usuário, selecione a opção Voltar

para:



Configuração Sil


Este menu permite configurar o SIL. Informações do fornecedor podem ser encontradas aqui .



O Diretório Inicial do SIL permite especificar o diretório em que todos os scripts serão armazenados. O padrão é JIRA_HOME / silprograms.

O conjunto de caracteres permite determinar em qual codificação seus scripts serão armazenados. É melhor deixar a codificação em UTF-8. Tenho uma péssima idéia de por que essa configuração pode ser necessária. O tamanho do cache

S IL permite especificar o número de scripts cujo código foi convertido em código de bytes Java e armazenado no cache SIL.

Por que precisamos de um cache SIL?

Aqui está um código SIL de amostra:

string message = "My message";
runnerLog(message);

Para executar esse código, precisamos convertê-lo em código de byte Java. O SIL contém um grande número de construções: estruturas, funções, loops, condições, atribuição e assim por diante. Portanto, para traduzir tudo isso em código de bytes Java, você precisa de tempo, e o cache do SIL permite economizar esse tempo. O código é convertido em código de bytes Java uma vez e armazenado no cache. Se esse código precisar ser executado novamente, o código de byte Java pronto será obtido do cache SIL.

Portanto, se você possui milhares de scripts SIL, faz sentido aumentar o tamanho do cache.

Fontes de dados


Este item de menu permite configurar fontes de dados para bancos de dados e usá-las no seu código.

Isso é conveniente porque você não precisa usar os parâmetros de acesso ao banco de dados e a senha do usuário no código. Você pode encontrar informações sobre fornecedores aqui .



Vamos configurar a fonte do banco de dados.

Clique no botão Adicionar fonte de dados e insira as configurações do banco de dados:



Eu tenho outro Jira instalado no meu computador e desejo obter dados do banco de dados desse Jira.
É importante observar que o SIL não contém drivers jdbc em sua distribuição. Portanto, você deve garantir a disponibilidade desses drivers no Jira. Aqui aqui você pode ler como fazê-lo.

Agora clique no botão Salvar e a fonte do banco de dados chamada external_database será criada:



Agora vamos usar esta fonte do banco de dados em nosso script:

string [] results = sql("external_database", "select * from cwd_group");
runnerLog(results);

Eu executo uma consulta neste script sql e obtenho o resultado:



Configuração do remetente de email


Este item de menu me fez sofrer no devido tempo. Informações do fornecedor podem ser encontradas aqui .

Você pode enviar e-mails usando sendEmail e, neste item de menu, você especifica os parâmetros para esta função.



O diretório Meus modelos permite especificar o caminho para os modelos de email .

O idioma do correio ativado permite especificar, com base no remetente ou destinatário, o idioma do modelo de email. Se você usar modelos de email, poderá criar o mesmo modelo para diferentes idiomas. Você pode ler mais sobre isso aqui .

Enviar email porpermite especificar como o email será enviado. Aqui estão as opções disponíveis:

  • Remetente do contêiner - a mensagem será enviada pela fila de e-mail padrão do Jira.



Além disso, você pode ver mensagens de erro e mensagens de depuração ao enviar email no arquivo atlassian-jira-outgoing-mail.log. Para fazer isso, você ainda precisa configurar o log de envio de mensagens de email para o Jira. Você pode ler mais sobre como configurar o log no Jira aqui . Eu prefiro usar esta opção em particular.
  • Remetente direto, personalizado - você pode especificar seu próprio servidor de email para enviar mensagens:





Nesse caso, você não verá mensagens de erro ou mensagens de depuração no arquivo atlassian-jira-outgoing-mail.log, mas verá mensagens no arquivo atlassian-jira.log.
  • Direct sender, default — , , Jira. atlassian-jira-outgoing-mail.log, atlassian-jira.log.
  • Null sender (log only) — atlassian-jira.log. . . com.keplerinfo ERROR, , . , , . , INFO com.keplerinfo. . :



2020-05-24 14:19:53,601+0300 pool-42-thread-8 INFO admin 859x6032x1 aizaws 0:0:0:0:0:0:0:1 /rest/keplerrominfo/refapp/latest/async-script/runScriptFromEditor [c.k.r.sil.impl.MailConfigurationAccessor] NULL MAILER (log only mail sender) : Subject: aa, From: null, To: [alex@gmail.com], CC: [alex@bk.ru], Body:
aa

Asynchronous Runner


Você pode ler as informações do fornecedor aqui :

Threads define o número de threads do SIL. Por padrão, o número de threads é 10, o que significa que apenas 10 scripts serão executados por vez. O restante ficará na fila e espere até que um dos threads esteja livre. Se você tiver um grande número de scripts em execução ao mesmo tempo, aumente esse parâmetro.

Time To Live (TTL) define o tempo de vida do thread. O valor padrão é 1 hora. Isso significa que se o script for executado por mais de uma hora, ele será eliminado e os resultados do script serão apenas aqueles que conseguiram ser concluídos nesta hora. Se você tiver scripts de longa execução, aumente esse parâmetro.

Intervalo do ponto de verificaçãodetermina com que frequência o SIL verificará se há scripts que são executados por mais tempo que o parâmetro de tempo TTL. E se tais scripts forem encontrados, eles serão mortos.

Também nesta tela, você pode ver todos os scripts que estão em execução no momento.

Sistemas remotos


O menu Sistemas Remotos permite:
  • Inclua conexões com instâncias externas do Jira e execute scripts SIL nessas instâncias.
  • Defina permissões para executar scripts SIL por meio da API SIL REST para usuários que não são administradores do Jira.

Você pode ler as informações do fornecedor aqui .

Vamos primeiro criar uma conexão remota com o Jira e executar um script SIL nele.
Eu levantei duas instâncias do Jira: localhost: 2990 / jira e localhost: 8080.
Eu criei esse script no localhost: 8080 e chamei esse script test.sil:

logPrint("ERROR", "I am called from " + argv[0]);

Este script utiliza um parâmetro e exibe uma mensagem com esse parâmetro no log atlassian-jira.log.
Agora no localhost: 2990 / jira, criarei uma conexão remota. Eu vou para a engrenagem -> Gerenciar aplicativos -> Sistemas remotos, clique no botão Adicionar remoto e insiro os dados do Jira para o host local: 8080:



Agora clico no botão Salvar e na mesma instância do Jira (localhost: 2990 / jira), criarei um script que chamará script com localhost: 8080:

call("my_ext_jira", "test.sil", "localhost:2990/jira")

O primeiro parâmetro é a conexão remota que eu criei: my_ext_jira.
O segundo parâmetro é o nome do script que será executado no sistema remoto (localhost: 8080): test.sil.

O terceiro parâmetro é a cadeia que será passada para test.sil: localhost: 2990 / jira.

Agora execute esse script (o localhost: 2990 / jira) e veja os logs no sistema remoto (localhost: 8080). Veremos esta linha:

2020-05-25 08:30:57,944+0000 pool-38-thread-2 ERROR admin 510x101x1 3sauem 172.26.0.1 /rest/keplerrominfo/refapp/latest/async-script/runScript [c.k.s.lang.routines.LogPrintRoutine] I am called from localhost:2990/jira

Isso significa que invocamos com êxito o script SIL no sistema remoto localhost: 8080 com localhost: 2990 / jira.

Agora, vejamos a seção Segurança na tela que vemos após selecionar o item de menu Sistemas remotos.

Suponha que tenhamos dois scripts no localhost: 2990 / jira.
test.sil

call("my_ext_jira", "test.sil", "localhost:2990/jira")

test1.sil

runerLog("Hello World");

E temos o usuário user1, que não possui direitos de administrador.

Queremos chamar scripts embutidos e scripts que estão no sistema de arquivos por este usuário.

Aqui está a tela do menu Sistemas Remotos:



Trabalharemos com os botões Grant execute inline, Grand read e Grant execute na seção Security.

Primeiro, tente chamar o script embutido como usuário1. Vamos chamar o script embutido usando esse método da API SIL REST.

http://localhost:2990/jira/rest/keplerrominfo/refapp/1.0/async-script/runScript

Aqui com este JSON:

{
   "source" : {
    "type": "INLINE",
    "code": "return 1;"
    }
}

E recebemos um erro 403 Proibido.

Agora pressione o botão Conceder execução embutida e conceda uma concessão ao usuário1:



E obteremos um código de resposta 200, o que significa que concluímos o script embutido com êxito.

Agora vamos executar o script test1.sil em user1. Desta vez, o JSON será assim:

{
   "source": {
        "type": "FILE",
        "code": "test1.sil"
    }
}

E, novamente, obtemos esse erro 403 Proibido.

Agora, concedemos direitos ao usuário1 para executar o script test1.sil. Clique no botão Conceder execução:



desta vez, o código de resposta é 200. Tudo deu certo.

Configuração LDAP


Você pode configurar a conexão com o LDAP. As informações do fornecedor podem ser encontradas aqui .

Inicio o servidor LDAP na janela de encaixe a partir daqui .

docker run -p 389:389 -p 636:636 --name my-openldap-container --env LDAP_ADMIN_PASSWORD="adminadmin" --detach osixia/openldap:1.3.0

O servidor ldap está em execução.

Agora, clique no botão Adicionar LDAP e configure a conexão:



Somente o Active Directory está disponível para o campo Diretório. Mas isso não significa que você só pode se conectar ao Microsoft Active Directory. Você pode se conectar a qualquer servidor LDAP. Eu conectei para abrir o LDAP.

Agora, vamos selecionar usuários do LDAP usando ldapUserList :

runnerLog(ldapUserList({"cn", "uid"}, "objectClass=*", "myldap"));

E obtivemos o resultado:



isso significa que tudo deu certo para nós.

Armazenamento de scripts


Este item de menu permite especificar onde você armazenará os scripts SIL. Você pode ler as informações do fornecedor aqui .

Por padrão, os scripts são armazenados no sistema de arquivos (disco opcional):



você pode optar por ter os scripts armazenados no banco de dados (banco de dados de opções). Nesse caso, os scripts serão armazenados na tabela AO_1B54DA_TSTEXT.

Na minha opinião, ainda assim, é melhor armazenar scripts no sistema de arquivos. Nesse caso, você pode usar um sistema de controle de versão, por exemplo, Bitbucket.

Mapeamento de campos personalizados


Neste item de menu, você pode especificar o mapeamento de tipos de campos personalizados para os tipos de valor SIL. Você pode ler as informações do fornecedor aqui .



Por exemplo, observe o campo Caixas de seleção personalizadas. O valor desse campo é mapeado para o tipo string [], o que significa que, se você quiser ler um valor de um campo do tipo Checkboxes, deverá escrever este código:

string[] value =  #{My Checkbox Field};

E para atribuir um valor, aqui está um código como este:

string[] value =  {"value1", "value2"};
#{My Checkbox Field} =  value;

Você não pode alterar o mapeamento para este campo porque é um campo padrão. E o Cprime já indicava o mapeamento correto.

Agora vamos ver o tipo de grade personalizada do campo. Obtivemos esse tipo no plug-in Table Grid Next Generation. O Cprime não fornece mapeamento para esse campo pronto para uso, portanto, ele é atribuído ao mapeamento padrão. O mapeamento padrão é string. Mas você pode alterar o mapeamento padrão para outro:



Em alguns casos, o mapeamento interno não é suficiente e, nesse caso, você pode gravar uma extensão no SIL com o seu mapeamento. Mais detalhes sobre como fazer isso podem ser encontrados aqui .

Configuração de integração


Você pode criar conexões com o Slack and Stride neste item de menu. O fornecedor tem instruções muito detalhadas sobre como fazê-lo aqui .

Configuração do SIL Webhooks


Você pode criar sua própria API REST que chamará scripts SIL. Você pode ler aqui .

SIL Diagnostic


Este item de menu fornece informações abrangentes de configuração do SIL:



A maioria dessas informações é necessária para os desenvolvedores do SIL, mas gostaria de chamar a atenção para um recurso importante nesta tela.

Você pode matar os scripts SIL atualmente em execução.

Suponha que você escreveu e executou um script que criou um loop infinito. Sem essa opção, você teria que esperar até que o script funcionasse mais do que o tempo no parâmetro Time To Live (TTL) e não fosse eliminado. Mas com esta opção você não pode esperar por este momento.

Basta clicar no botão Matar:


All Articles