\section{Arquitetura} \label{sec:architecture} Com base na extensa lista de requisitos funcionais definidos pelo Governo Federal do Brasil, selecionamos alguns sistemas livres compor a solução proposta para o novo SPB. Avaliamos os sistemas que juntos poderiam fornecer o maior sub-conjunto possível dos requisitos. Nós também estávamos convencidos de que seria impossível fornecer todas as funcionalidade com uma única ferramenta. Do ponto de vista da arquitetura, dois requisitos eram importantes para a nova plataforma: \begin{enumerate} \item \textit{Integrar sistemas livres existentes}, com diferenças mínimas de suas versões originais; \item \textit{Fornecer uma interface de usuário unificada} entre os diferentes sistemas, bem como a autenticação centralizada. \end{enumerate} A adoção de sistemas livres existentes e a minimização de mudanças feitas localmente tiveram como objetivo ser capazes de atualizar para versões mais recentes do software original, nos beneficiando pelas melhorias e manutenção feitas pelas comunidades de projetos existentes. Proporcionar uma interface de usuário consistente em cima dessas diferentes ferramentas era necessária para fazer a transição entre os diferentes sistemas sem a percepção do ponto de vista dos usuários, ou seja, sem confundí-lo através de interfaces completamente diferentes ao interagir com o portal. Para o primeiro requisito, identificamos quatro sistemas principais que exigiam equipes especializadas para o trabalho no processo de integração. As equipes aprenderam a desenvolver para os sistemas designados e contribuíram para as comunidades originais, de modo que a versão que usamos não era significativamente diferente do original. Ao final do projeto, o portal SPB foi composto por mais de dez sistemas, como Colab, Noosfero, Mezuro, Gitlab, Mailman, Postfix e Munin. A seguir apresentamos os mais relevantes, bem como como eles foram integrados na plataforma. \begin{itemize} \item \textbf{Colab\footnote{\url{https://github.com/colab}}:} é uma plataforma de integração de sistemas para aplicações web. Um de seus objetivos é permitir que diferentes aplicações sejam combinadas de tal forma que um usuário não note a mudança entre as aplicações. Para isso, o Colab oferece autenticação centralizada, consistência visual, retransmissão de eventos entre aplicações e mecanismo de busca integrado. \item \textbf{Noosfero\footnote{\url{http://noosfero.org}}:} é um software para redes sociais e de colaboração. Além dos recursos clássicos de redes sociais, ele também fornece recursos de publicação de conteúdo, como blogs e CMS (\textit{Content Management System}) de propósito geral. A maioria das interações do usuário com o novo SPB são através do Noosfero: registro do usuário, páginas do projeto e de documentação e formulários de contato. \item \textbf{Gitlab\footnote{\url{http://gitlab.com}}:} é um gerenciador web de repositórios Git com páginas wiki e recursos de \textit{issue tracker}. O Gitlab é uma plataforma livre e se concentra em oferecer uma solução para desenvolvimento colaborativo em torno do repositório. \item \textbf{Mezuro\footnote{\url{http://mezuro.org/}}:} é uma plataforma para coletar métricas de código-fonte com o objetivo de monitorar a qualidade interna de projetos de software livre escrito em C, C ++, Java, Python, Ruby ou PHP. \end{itemize} \begin{figure}[hbt] \centering \includegraphics[width=.5\linewidth]{figures/arch.png} \caption{Visão geral da arquitetura do novo portal SPB.} \label{fig:architecture} \end{figure} Do ponto de vista prático, a plataforma SPB foi implantada em 7 máquinas virtuais com diferentes funções\footnote{\url{https://softwarepublico.gov.br/doc/arquitetura.html}}. A arquitetura conceitual da plataforma é apresentada na Figura \ref{fig:architecture}. Em resumo, o Colab inicialmente lida com todas as requisições do usuário, redirecionando as solicitações para as ferramentas integradas. Ele processa as respostas das ferramentas abaixo dele, bem aplica uma aparência visual consistente em cada uma, gerenciando também a autenticação e fornecendo uma busca unificada entre elas.