Skip to content

Instantly share code, notes, and snippets.

@cvbarros
Last active July 15, 2016 18:35
Show Gist options
  • Save cvbarros/8e4a8eb4ee0471d564c6c73d54b5d1f5 to your computer and use it in GitHub Desktop.
Save cvbarros/8e4a8eb4ee0471d564c6c73d54b5d1f5 to your computer and use it in GitHub Desktop.
Migração NUGET

Migração NuGet

Introdução

O trabalho que viemos realizando ao longo dos últimos dias para a migração para um novo servidor de pacotes (Nuget) foi concluído. Esse texto visa instruir os times de desenvolvimento como proceder nessa migração, tendo em vista que o servidor de pacotes antigo (nuget.braspag.com.br) será desativado dentro de um mês (até 08/08/16), para servir pacotes diretamente para o desenvolvimento.

Por essa razão, é imperativo que todos tomem ciência e convertam seus ambientes o quanto antes. Para não tomar muito tempo de todos, coloquei direto as instruções. Mas aqueles que quiserem saber os motivos por trás do trabalho, estão convidados a ler o documento inteiro.

ANTES DE EXECUTAR A MIGRAÇÃO, o Team Foundation Power Tools 2015 deverá ser instalado.
ATENÇÃO: Executar o setup "Custom" e selecionar o item Powershell Cmdlets durante a instalação! https://visualstudiogallery.msdn.microsoft.com/898a828a-af00-42c6-bbb2-530dc7b8f2e1

Caso surja alguma dúvida, basta entrar em contato comigo.

TL;DR - Migração de ambiente

O script de migração das estações de desenvolvedores executa os seguintes passos:

  • Desativa a o servidor antigo bem como o nuget.org como package sources da máquina;
  • Habilita o novo servidor, https://bpnuget.braspag.com.br como package source;
  • Configura as credenciais necessárias para acessar o novo servidor;
  • Configura as credenciais necessárias para que o nuget.exe tenha acesso via proxy ao novo servidor. Essas credenciais são as mesmas do AD, e ficam criptografadas no arquivo nuget.config padrão da máquina;
  • Cria uma pasta .\build na raiz do Team Project contendo itens do StyleCop, bem como o nuget.exe.
  • Cria um arquivo nuget.config na raiz do Team Project que funciona como base da configuração para todas as soluções abaixo daquele Team Project.

Passos para executar a migração:

  1. Get Latest: $\Tools\Powershell\BraspagDev, digamos na pasta C:\tfs\Tools\Powershell\BraspagDev
  2. Abrir o prompt Powershell como Administrador:
PS> cd C:\tfs\Tools\Powershell\BraspagDev
PS> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
PS> Import-Module .\BraspagDev.psd1 -Force -DisableNameChecking
  1. Após importar o módulo, mude o diretório para onde o seu Team Project, está mapeado (p.e: C:\tfs\PagadorV1)
PS> cd C:\tfs\PagadorV1
  1. Executar os comandos abaixo e aguardar a migração ser concluída. Primeiro, serão solicitadas as credenciais do proxy, caso esteja configurando a estação da Braspag. Logo após, serão solicitadas as crededenciais do servidor nuget. Essa credencial é única para todos os membros do desenvolvimento, por enquanto. Consulte a pessoa do seu time que recebeu essas credenciais.
PS> Set-PackageRepositoryPath C:\tfs\packages
PS> Set-NugetEnvironment -BuildToolsPath .\build -SetupProxy -CreateBuildFolder

Obs.*: Caso esteja executando de casa, omita a opção -SetupProxy do comando, pois o mesmo só é necessário para o ambiente corporativo da Braspag.

FIM TL;DR

Motivação

Atualmente o nosso servidor de Nuget está aberto na Web e sem autenticação. Isso significa que boas parte da propriedade intelectual, que esteja localizada em pacotes, está desprotegida. Além disso, por conta dessa abertura, o servidor não suporta a publicação de pacotes, sendo necessário que os desenvolvedores os publiquem apenas através de SFTP. O método de SFTP não é acessível remotamente (home office, por exemplo), prejudicando ainda políticas de continuidade de negócios.

Outro fator é o isolamento da dependência direta do nuget.org, visto que caso o site esteja fora ou algum pacote não esteja mais disponível, o nosso servidor garantirá a disponibilidade, pois o mesmo atua como proxy para o nuget.org. Durante a migração, atuará também como proxy para o servidor antigo. Adicionalmente, o nosso software que controla o serviço de nuget possibilita outros tipos de feeds, como npm, powershell, entre outros, além de ter diversas funcionalidades caso queiramos migrar para a versão Enterprise, tais como:

  • Integração com AD para segurança
  • Permissões granulares por feeds (scoped permissions)
  • Filtro de pacotes (por licensa, etc)
  • Políticas de retenção

Junto com os fatores acima, existe ainda a eliminação do push de pacotes via SFTP, sendo o mesmo feito pelo mecanismo padrão do nuget. Entretanto, para garantir que os pacotes sejam gerados à imagem do repositório e do código atualmente no controle de versão, apenas o build server (CI) poderá publicar os pacotes, inicialmente. Dessa maneira, nenhum pacote será publicado diretamente da estação de dev, evitando falhas humandas no processo. Futuramente, caso seja necessário, essa política pode ser alterada no servidor de pacotes.

Package Restore

Não relacionado à migração em si, mas aproveitando que esse trabalho de conversão foi feito, existe a opção para os times que queiram remover a pasta packages das solutions no TFS e passem a utilizar o package restore.

Existem vários argumentos a favor da utilização do package restore, sendo eles:

  • Eliminação de binários de terceiros do controle de versão (artefatos que não deveriam ser versionados)
  • Retirada de noise durante code reviews e changesets, visto que os pacotes não precisam mais estar nos check-ins.
  • Alivia o tamanho do repositório economizando espaço em disco do servidor de build e tempo ao baixar o repositório.
  • Evita falha humana na quebra de builds, reduzindo o número de itens que estejam contidos no check-in.

Para migrar uma determinada solution para o package restore, o módulo powershell carregado na migração também possui funcionalidade que permite esse processo. O comando irá ajustar os projetos levando-se em conta algumas peculiaridades (tal como StyleCop e xunit.runner) e remover a pasta "packages" no nível da solução.

  1. Na pasta raiz do Team Project, já tendo executado o comando Set-NugetEnvironment da migração, configure a pasta onde os pacotes serão armazenados. Por convenção, o build template está preparado para que essa pasta esteja 1 nível acima da raiz do Team Project, por exemplo:

Raiz do Team Project: C:\TFS\PagadorV1
Pasta de pacotes: C:\TFS\packages

Nesse caso, abra o Powershell como administrador, e importe o módulo BraspagDev (no caso, coloque o caminho correto do mapeamento para seu workspace)

PS> Import-Module C:\TFS\Tools\Powershell\BraspagDev\BraspagDev.psd1 -Force -DisableNameChecking
PS> Set-RepositoryPath C:\TFS\packages
  1. Após importar o módulo, mude o diretório para a pasta raiz do seu Team Project (C:\TFS\PagadorV1 nesse exemplo). O comando a ser executado é o ConvertTo-NewNugetEnvironment, que tem 4 argumentos, sendo eles:
    • SolutionName: Nome do arquivo .sln a ser convertido. O comando irá buscar recursivamente o arquivo, basta colocar o nome, por exemplo: "PaymentMethods.Epay.sln"
    • BuildToolsPath: O caminho da pasta "build". Por default na migração a mesma fica abaixo do Team Project, então basta passar ".\build"
    • RepositoryPath: Caso não tenha configurado com o comando Set-RepositoryPath, é necessário passar a pasta com caminho absoluto aqui.
    • RemoveNugetPack: Caso queira deixar a cargo do servidor realizar o nuget pack, essa opção remove ações de post-build de projetos. Para tal, será necessário alterar o build template do projeto. O padrão é $true, então basta omitir o argumento.

Como exemplo, esse comando seria chamado assim:

PS> cd c:\TFS\PagadorV1
PS C:\TFS\PagadorV1> ConvertTo-NewNugetEnvironment -SolutionName PaymentMethods.EPay.sln -BuildToolsPath .\build -RepositoryPath C:\TFS\packages
  1. Caso a conversão seja bem sucedida, os arquivos alterados ficarão como pending changes no seu workspace. Lembre-se de realizar o check-in após todo o processo para finalizar a conversão.

  2. O build definition do projeto em questão deverá ser alterado para levar em conta o package restore e a remoção do nuget pack. Como referência, veja as imagens em anexo.

    • O arquivo DefaultCodeMetricsWithPackageRestoreTemplate.11.2.xaml localizado no TFS em $\PagadorV1\BuildProcessTemplates deve ser copiado para a mesma pasta BuildProcessTemplates do seu Team Project.
    • Editar o build definition e alterar o Process Template para o novo template. Caso tenha retirado o nuget pack, coloque a opção Publish Package pata True.
    • As configurações de Source do build template devem ser alteradas para também mapear novos arquivos:
      • Mapear a pasta $\TeamProject\build -> $(SourceDir)\build
      • Mapear o arquivo $\TeamProject\nuget.config -> $(SourceDir)\nuget.config
      • Mapear a pasta $\Tools\Powershell\BraspagDev -> $(SourceDir)\scripts
  3. Salvar o build template e realizar commit nas pending changes.

Caso precise de alguma ajuda nesse processo, basta falar comigo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment