diff --git a/cap05.Rmd b/cap05.Rmd index 7cc9ecc60f99132adcff62b78527eaa2fa6b3eff..6b2a4e1d737b836d7b6fa05f5bb3e200f4e4ea9c 100644 --- a/cap05.Rmd +++ b/cap05.Rmd @@ -487,15 +487,105 @@ Científica e Software Livre - da UFPR. # Fluxo de trabalho # -<https://www.atlassian.com/git/> +O fluxo de trabalho de um projeto Git local e usando um servidor remoto +já foram apresentados. O fluxo com um repositório Git mantido em um +serviço, como o GitHub ou Gitlab, não muda muito. A maior diferença não +é sobre o uso de novas instruções Git mas sim a adoção de uma estratégia +de trabalho (*workflow*) baseada nos recursos desses serviços, como as +*milestones* e *issues*. + +Em termos de comandos, acrescenta-se aqueles necessários para se +comunicar com um repositório remoto. Da mesma forma que o ramo default +do Git é o `master`, o repositório remoto é por default chamado de +`origin`. + +Ao considerar um seviço web, você pode começar um repositório novo de +duas formas: localmente ou pelo serviço. + +Pelo serviço, qualquer que seja, crie um novo repositório. GitHub e +GitLab dão instruções resumidas de como proceder logo que você cria um +novo repositório, inclusive, incluem opções como criar um repositório +com arquivo de `README`. Assim que criar, seu repositório terá um +endereço. Na sessão anterior, **Gerenciar repositórios**, descremos o +processo de criar e *clonar* o repositório e também de criar local e +adicionar um endeço do `origin`. + +Localmente o repositório segue o ciclo normal de desenvolvimento que +minimamente contém das intruções `git add` e `git commit`. Os fluxos de +trabalho em geral preconizam o desenvolvimento a partir de *branches* de +demanda cujo conteúdo será incorporado aos ramos permanentes (`master`, +`devel`). Para criar um ramo -clone, add, commit, branch, push, fetch, pull. +``` +## Cria um ramo chamado issue#10. +git branch issue#10 + +## Muda do ramo atual para o recém criado. +git checkout issue#10 + +## Segue a rotina. +git add ... +git commit ... + +## Sempre que quiser, suba o trabalho. +git push origin issue#10 +``` + +``` +## Lista os ramos locais. +git branch -l + +## Lista os remostos. +git branch -r + +## Lista todos. +git branch -a +``` + +``` +## Remove um ramo local (não mais útil). +git branch -d issue#10 + +## Remove um ramo remoto (não mais útil). +git branch -dr origin/issue#10 + +## Remove um ramo remoto na origem (duas formas). +git push origin --delete issue#10 +git push origin :issue#10 +``` + +``` +## Lista os remotos. +git remote -v + +## Renomeia para um nome melhor +git remote rename origin servidor -push branch, delete branch no origin +## Remove. +git remote rm servidor -setar outros remotes +## Adiciona um endereço de remoto (origin) +git remote add origin <url> +git remote add servidor <url> + +## Adiciona/remove URLs ao origin. +git remote set-url origin --add <url> +git remote set-url origin --delete <url> +``` diferença de fetch e pull +https://www.atlassian.com/git/tutorials/syncing/git-push +https://www.quora.com/Whats-the-difference-between-git-pulland-git-fetch + +``` +## https://git-scm.com/docs/git-fetch +## O remote default é o origin. refspec é um ramo ou commit. +git fetch <remote> <refspec> +git fetch --all +git fetch --verbose + +## https://git-scm.com/docs/git-pull +``` # Macanísmos de colaboração # @@ -845,6 +935,9 @@ fazer *webhook* com Slack ## GitLab ## +https://about.gitlab.com/gitlab-ci/ +https://about.gitlab.com/2015/02/03/7-reasons-why-you-should-be-using-ci/ + A Integração Contínua passou fazer parte do GitLab CE na [versão 8.0], lançada em setembro de 2015. Diferente do GitHub, essa versão do GitLab tem o IC de forma nativa. Você pode configurar servidores externos para @@ -855,6 +948,8 @@ GitLab. [Digital Ocean] parar verificar repositórios hospedados no <https://gitlab.com/>. +TODO Definir *runner*, *build*, *YAML*. + Segundo ele, o primeiro passo é acessar <https://gitlab.com/ci/> para adicionar o projeto à integração contínua. Isso vai gerar um *token* de registro que será passado para o *runner* que deve estar em uma @@ -888,7 +983,7 @@ e [mcglm], dois pacotes R. ### O arquivo `.gitlab-ci.yml` ### A documentação oficial sobre como usar o arquivo `.gitlab-ci.yml` -encontra-se em: <http://doc.gitlab.com/ce/ci/yaml/README.html>. +encontra-se em <http://doc.gitlab.com/ce/ci/yaml/README.html>. O arquivo `.gitlab-ci.yml` fica na raíz do projeto. Seu conteúdo define todo o processo de verificação do seu repositório a partir de uma série @@ -908,49 +1003,82 @@ job2: Neste exemplo existem dois *jobs* (tarefas). Cada um deles corre independente e podem ser executados simultâneamente. O primeiro executa um *script* shell e o segundo comandos *shell* em uma lista. Porém, tais -arquivos podem ser bem mais complexos com campos além do `script:`. - -Todos são opcionais: - - * `image`: para usar uma imagem *docker*. O tutorial de [Alan Monger] - considera esse campo. - * `services`: também refere ao *docker*. Documentação oficial sobre - isso encontra-se em +arquivos podem ser bem mais complexos, com campos além do `script:`. Os +campos a seguir são todos opcionais: + + * `image`: para especificar uma imagem [*docker*]. O tutorial de + [Alan Monger] considera esse campo. + * `services`: também refere ao *docker*. Tais campos são de uso menos + frequênte, porém existe uma séria de vantagens neles. A documentação + oficial sobre isso encontra-se em <http://doc.gitlab.com/ce/ci/docker/README.html>. * `before_script`: define comandos/scripts a serem executados antes - dos principais. É como se fosse o estágio zero, usado para - preparação, do qual não se espera falhas pode não deve depender do - projeto. - * `stages`: define os estágios de excecução do *jobs* para haver uma - exceussão condicional. Jobs de mesmo estágio são executados - paralelamente mas àqueles à frente só são executados se houver - sucesso dos predecessores. - * `variables`: serve para criar variables de ambiente que podem ser + dos principais. São instruções de preparação das quais não se espera + falhas pois não deve depender do projeto. + * `stages`: define a ordem de excecução dos *jobs* que estabalecer uma + cadeia de execução condicional. Jobs de mesma ordem ou do mesmo + estágio são executados paralelamente mas àqueles à frente só são + executados se houver sucesso dos predecessores. + ``` + stages: + - construcao + - teste + - entrega + + job_contrucao: + script: "construcao.sh" + stage: construcao + + job_test: + script: "teste_codigofonte.sh" + script: "teste_documentacao.sh" + stage: teste + + job_entrega: + script: "compacta_transfere.sh" + stage: entrega + ``` + * `variables`: serve para criar variaveis de ambiente que podem ser usados por todos os comandos e scripts. * `cache`: indica os diretórios e arquivos que serão mantidos entre os - jobs (builds). - -Exceto os nomes listados acima, um job pode ter um nome qualquer. -Dentro de um job tem-se uma lista de campos disponíveis também: - - * `script`: é o campo para especificar um arquivo de script *shell* ou - uma lista de comandos a serem executadas pelo *runner*. - * `only` e `except`: restringem para ou excluem uma lista de - referências git (*branches* ou tags*) a aplicação do job. Esse campo - entende expressões regulares. - * `tags`: são usadas para selecionar os runners na lista de runners - disponíveis. Os runners possuem tags. - * `allow_failure`: - * `when`: é um comando que dispara exceussões condicionais - * `on_failure`: são instruções executadas quando algum o job do + *jobs* (builds), possivelmente porque são aproveitados futuramente. + +Com excessão dos nomes listados acima, um *job* pode ter qualquer nome, +desde que seja exclusivo. Dentro de um *job* tem-se também uma lista de +campos disponíveis para configurá-lo: + + * `script`: especifica script *shell* ou uma lista de comandos a serem + executados. + * `stage`: já mencionado anteriormente, serve para dar a ordem de + execução dos *jobs*. Vários *jobs* podem ser do mesmo estágio e + nesse caso são executados paralelamente. + * `only` e `except`: servem para restringir a execução do *job*, + incluindo ou excluindo, para uma lista de referências git, como + *branches* ou *tags*. Esse campo permite expressões regulares, úteis + para incluir (excluir) ramos representáveis por *regex*, como são os + ramos de desenvolvimento do nosso workflow, iniciados com *issue*. + ``` + job_test: + script: "teste_codigofonte.sh" + script: "teste_documentacao.sh" + stage: teste + only: + - /^issue.*$/ ## Os que começam com issue + ``` + * `tags`: são usadas para indicar o *runner* da lista de + disponíveis. Na configuração dos *runners* pode-se atribuir *tags* + que servem justamente para esse tipo de pareamento. + * `allow_failure`: indica jobs que mesmo que falhem, não serão + considerados para dar estampa de sucesso ou falha. + * `when`: é um comando que dispara excussões condicionais ao sucesso + do *job* anterior + * `on_failure`: são instruções executadas quando algum o *job* do estágio anterior falhou. - * `on_success`: são instruções executadas quando todos os jobs do + * `on_success`: são instruções executadas quando todos os *jobs* do estágio anterior foram bem sucedidos. * `always`: excutados sempre. - * `artifacs`: - * `cache`: especifa arquivos e diretório mantidos entre um build e outro. - -inilimatos jobs ao mesmo tempo. + * `cache`: especifica arquivos e diretório mantidos entre um *build* e + outro. No caso do pacote LegTools, o arquivo `.gitlab-ci.yml` do repositório tem o seguinte conteúdo: @@ -983,15 +1111,36 @@ Caso queira a estampa para outros ramos, é só acrescentá-los. ### Runners ### -Os jobs são executados pelos *runners* dentro de seus ambientes. Cada -job corre independente do demais TODO qual implicação disso? - -TODO http://doc.gitlab.com/ce/ci/runners/README.html - -https://about.gitlab.com/gitlab-ci/ -https://about.gitlab.com/2015/02/03/7-reasons-why-you-should-be-using-ci/ - -<https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software> +Em poucas palavras, um *runner* é uma máquina que executa o build por +meio do GitLab CI. Um *runner* pode ser específico de um projeto ou pode +ser um *runner* compartilhado, disponível à todos os projetos. Estes +últimos são úteis à projetos que tem necessidades similares, como todos +àqueles projetos que são pacotes R, por exemplo. Isso facilita a +administação e atualização. Os específicos, por outro lado, atendem +projetos com demandas particulares. + +Apenas usuários com permissões de *admin* podem criar runners +compartilhados. + +Ir em Settings > Services e marcar *active*. Isso vai criar 6 novas +entradas no menu da esquerda + + * *Runners*: contém instruções de como usar um *runner* específicos e + compartilhados. + * *Variables*: define variáveis que são omitidas no *log* do *build*, + útil para passar senhas. + * *Triggers*: servem para ?? + * *CI Web Hooks*: esse *web hook* pode ser usado para criar eventos + quando o build é concluido. + * *CI Settings*: configurações gerais + * *CI Services*: permite integrar o CI com outros serviços, como email + e Slack. + +Para habilitar um *runner*, é necessário instalar o +`gitlab-ci-multi-runner`. O [repositório oficial do *GitLab Runner*] +contém as instruções de instalação e configuração e a +documentação oficial sobre [*runners*] indica como tirar melhor proveito +do recurso. <!---------------------------------------------------------------------- --> @@ -1011,3 +1160,6 @@ https://about.gitlab.com/2015/02/03/7-reasons-why-you-should-be-using-ci/ [GitLab do LEG]: http://git.leg.ufpr.br/ [legTools]: http://git.leg.ufpr.br/leg/legTools [mcglm]: http://git.leg.ufpr.br/wbonat/mcglm +[*docker*]: https://www.docker.com/ +[repositório oficial do *GitLab Runner*]: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner +[*runners*]: http://doc.gitlab.com/ce/ci/runners/README.html