Prof. Me. Cícero Samuel Clemente Rodrigues
Gerência de Configuração de Software (GCS) é um conjunto de atividades de apoio que permite a absorção ordenada das mudanças inerentes ao desenvolvimento de software, mantendo a integridade e a estabilidade durante a evolução do projeto.
Configuração é o estado do conjunto de itens que formam o sistema em um determinado momento.
Pergunta
Por que o sistema mudou?
Quais foram as mudanças?
O sistema continua funcionando depois das mudanças?
Atividade
Controle de Mudança
Controle de Versão
Integração Contínua
Implementação da mudança
Pedidos de mudança
Registro da configuração
O controle de versão notifica a integração contínua
(e ao controle de mudanças)
Teste são realizados e as métricas e resultados são comunicados a equipe
Controle de Mudanças
Controle de Versão
Integração Contínua
Ferramentas que auxiliam no registro, avaliação, planejamento e acompanhamento das solicitações de mudanças mudanças
Ferramentas que realizam o registro histórico das configurações, controle da concorrência de edição dos arquivos, cria e mantém variações do projeto
Ferramentas as quais executam scripts de construção, teste e métricas de qualidade para avaliar a integridades do Sistema
Controle de Versão
Controle de Mudanças
Integração Contínua
RebelLabs [2013]
Registra a evolução do projeto
Controla a concorrência de edição dos arquivos
Cria e mantém variações do projeto
{
Funções do Controle de Versão
Precisamos registrar o estado dos arquivos antes de ir para próxima implementação
A solução mais comum é compactar nomeando com a data ou versão
Com o tempo, torna-se impossível a gestão dessas versões...
Só os backups não bastam!
Provê mecanismos para controle de concorrência:
Um controle de versão é composto por:
armazena todo o histórico de evolução do projeto, registrando toda e qualquer alteração feita em cada item versionado
contém a cópia dos arquivos do projeto e que é monitorada para identificar as mudanças realizadas
envia modificações feitas gerando uma revisão
atualiza espaço de trabalho a partir de uma revisão
é o estado dos arquivos em determinado momento
(uma fotografia)
é uma configura configuração registrada
Rastreabilidade Bidirecional
Changeset
=
diferença entre duas configurações
Responde a pergunta
"O que mudou?"
config1
+
changeset2
=
config2
changeset2
=
config2
config1
-
Configuração é o estado dos arquivos do projeto em um determinado momento
Revisão é uma configuração registrada no repositório
Changeset é o conjunto de diferenças entre duas configurações
Versão é uma revisão usada em produção (Release)
Tipo de Controle de Versão
Variam de acordo com o arranjo entre o repositório e espaço de trabalho
Centralizado
Distribuído
Há um único repositório e várias cópias de trabalho que se comunicam apenas através do repositório central.
Cada desenvolvedor possui um repositório próprio acoplado a uma área de trabalho.
A comunicação entre eles continua sendo através de commit e update.
pull (puxar)
Atualiza o repositório local (destino) com todas as alterações feitas em outro repositório (origem)
push (empurrar)
Envia as alterações do repositório local (origem) para um outro repositório (destino)
Centralizado | Distribuído | Descrição |
---|---|---|
checkout | clone | criação da cópia de trabalho/repositório |
commit | commit | envia alterações para o repositório, criando uma revisão |
update | update checkout fetch |
atualiza a cópia/área de trabalho em uma revisão |
pull | importa revisões feita em outro repositório | |
push | envia revisões locais para outro repositório |
Numeração sequencial definida a partir da ordem das revisões
Hash SHA-1 a partir de cada configuração
Ex.: Subversion
Ex.: Mercurial e o GIT
The end result was I decided I can write something better than anything out there in two weeks, and I was right.
Modified/Untracked
Staged
Commited
git help
man git
ou
git config --global user.name "Nome"
git config --global user.email e-mail
Identificação
git config --global core.editor editor
Editor
git config --list
Verificar configurações atuais
Para iniciar um repositório Git:
Este comando cria toa a estrutura que o Git necessita para funcionar.
Os arquivos são criados na pasta oculta .git/
git init
O git status exibe as alterações ocorridas no repositório desde o último commit.
git status
O git add adiciona ou atualiza um arquivo da staging area.
Ou seja, o comando informa ao Git para rastrear o referido arquivo. Caso o arquivo já esteja sob controle do Git, ele o atualiza.
git add arquivo
git add .
git add diretório
git commit transfere o estado do projeto salvo na staging area para o repositório do projeto.
git commit
git commit -m "descrição do commit"
git commit -am "descrição do commit"
Todo commit deve possuir uma mensagem de identificação, usada para descrever as alterações do commit.
Favor, use-a para tal fim.
Escreva mensagens intuitívas.
O comando git diff compara o estado do repositório atualmente com o estado salvo na staging area
git diff
git diff arquivo
git diff id_commit
git diff id_commit id_commit
O git status informa "quem" foi alterado, mas e se eu quiser saber exatamente "o que" foi alterado?
O comando git diff --cached compara o estado do repositório salvo na staging area com o estado do último commit
git diff --cached
git log
git log --oneline
git log -p
git log --graph
O comando git log exibe o histórico de commits do projeto
A partir do código associado aos commits você pode voltar para um determinado 'estado' do projeto
git checkout id_commit
O comando git checkout também redireciona arquivos e branches
git checkout arquivo
git checkout .
Você pode descartar mudanças no seu working directory voltando o estado dos seus arquivos para o último salvo na staging area.
git reset HEAD arquivo
git reset HEAD .
O comando git reset HEAD devolve as modificações da staging area para o working directory.
1ª Solução: git reset
O comando git reset faz o projeto/arquivo voltar para um estado anterior.
git reset id_commit
git reset arquivo
git reset --hard id_commit
Reflete essa mudança para staging area e work directory
2ª Solução: git reset
O comando git revert não desfaz um commit, mas cria outro removendo a alteração anterior
git revert id_commit
O comando git rm remove um arquivo do seu projeto.
git rm arquivo
git rm --cached arquivo
A opção --cached remove o arquivo apenas do Git, sem esta opção o comando remove o arquivo do seu computador também.
Deixar todos os arquivos contidos na pasta do projeto sob controle do Git pode acabar dificultando o gerenciamento, e muitas vezes simplesmente não achamos necessário rastrear alterações de alguns arquivos (arquivos temporários, executáveis e etc...).
O arquivo oculto .gitignore é o responsável por dizer ao Git quais arquivos ele pode ignorar.
Basta adicionar uma pattern que o Git usará para ignorar os arquivos.
Todos os arquivos que 'casarem' com as patterns serão ignorados.
As patterns seguem o padrão utilizado nos sistemas unix/Linux.
#comentario
* qualquer caractere
! negação
/** subdiretório
Exemplos de patterns e extensões podem ser geradas em gitignore.io
O Git permite criar uma linha independente de desenvolvimento no seu projeto. Isto permite alterações em partes especificas do software sem comprometer o restante do projeto.
O comando git branch cria um novo branch a partir do último commit.
git branch nome_branch
Além de visualizar commits antigos, o git checkout também é o responsável por alterar o branch corrente.
git checkout nome_branch
Após desenvolvedor uma funcionalidade separada do fluxo principal, muitas vezes é interessante incorporar as modificações no branch master.
O comando git merge uni dois branches novamente, combinando as funcionalidades do branch independente com o branch atual.
git merge nome_branch
Quando não há commits posteriores à criação do branch, a incorporação das funcionalidades ocorre sem nenhum problema.
Porém, quando os branches divergem, o Git precisa que combinar seus conteúdos.
Para informar o trecho conflitante, o Git sinaliza as linhas do arquivo com algumas marcações(<<<<<<<, ======= e >>>>>>>), para corrigir o conflito e confirmar o merge, basta apagar as linhas desnecessárias do arquivo, mantendo conteúdo escolhido, e efetuar um novo commit. Este é basicamente o único trabalho manual que o Git necessita
Após incorporar um branch à outro, pode não ser mais necessário manter uma ramificação. Para deletar um branch utiliza-se do parâmetro -d juntamente com o comando git branch
git branch -d nome_branch
Tempo de vida infinito
máster (origin/master)
develop (origin/develop)
As branches de suporte comumente usadas são
Release branches dão suporte à preparação de uma nova liberação(release) de produção.
Utlizadas para pequenas correções de bugs e preparar metadados para uma versão (número da versão, datas de criação, etc.)
Muitas empresas possuem servidores dedicados para suas equipes, mas há algumas soluções no mercados que cumprem a mesma função.
O comando git remote add é o responsável por referenciar um repositório remoto em um repositório local já existente
O comando git remote rm é utilizado para apagar uma referência à um repositório remoto. Util quando se deseja substituir o local onde o remoto está hospedado.
git remote add origin URL
git remote rm origin
Quando se deseja iniciar/continuar um projeto já existente, utiliza-se dogit clone para copiar todo um repositório remoto para uma máquina local.
git clone URL
O Git disponibiliza duas maneiras de baixar as atualizações de um repositório remoto. O comando git fetch baixa as atualizações mas não as incorpora ao repositório local.
git fetch
git fetch origin master
git fetch origin nome_branch
Outra maneira é utilizando o comando git pull, que baixa e incorpora as modificações no repositório local. Equivale à um git fetch seguido de uma git merge.
git pull
git pull origin master
git pull origin nome_branch
Versão
=
Revisão
Release
Pode se tornar uma
Um release de sistema é uma versão de um sistema de software distribuída aos clientes. (Sommerville, 2011).
Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
- versão Maior(MAJOR): quando fizer mudanças incompatíveis na API,
- versão Menor(MINOR): quando adicionar funcionalidades mantendo compatibilidade, e
- versão de Correção(PATCH): quando corrigir falhas mantendo compatibilidade.
Rótulos adicionais para pré-lançamento(pre-release) e metadados de construção(build) estão disponíveis como extensão ao formato MAJOR.MINOR.PATCH.
Conforme incluímos funcionalidades no sistema, podemos definir pontos relevantes no software, que geralmente, marcam uma versão de lançamento.
O comando git tag inclui um rótulo à um determinado commit para que este possa ser referenciado mais facilmente.
git tag -a versao -m "descrição"
Para visualizar as versões ja criadas, utilize git tag.
git tag
Por padrão, o comando git push não transfere tags
Você deve enviar as tags explicitamente – você executa git push origin [nome-tag].
git push origin v1.5
se deseja enviar muitas tags ao mesmo tempo digite:
git push origin --tags
Ian Sommerville
"
"
O processo de controle de mudanças deve ser implementado depois que uma baseline for fixada - antes disso, somente um controle de mudanças informal precisa ser aplicado
Roger Pressman
"
"
Processos permitem que:
Ian Sommerville
O cliente geralmente está diretamento envolvido na gestão de mudanças
Ele propõe a mudança dos requisitos e trabalha com o time para avaliar o impacto e decidir a prioridade da mudança em relação aos demais requisitos
Alterações para melhoria do software são decididas pelos programadores que trabalham no sistema
A refatoração, onde o software é aprimorado continuamente, não é vista como uma sobrecarga, mas como uma parte necessária do processo de desenvolvimento.
Para gerenciamento de Mudanças
Continuous integration (CI) is a software development practice where
developers regularly merge their code changes into a central repository, after
which automated builds and tests are run.
Amazon Web Series, 2017
CI most often refers to the build or
integration stage of the software release process and requires both an automation component (e.g., a CI or build service) and a cultural component (e.g., learning to integrate frequently)
Amazon Web Series, 2017
Continuous delivery (CD) is a software development practice where code
changes are automatically built, tested, and prepared for production release
Amazon Web Series, 2017
Continuous Delivery
Continuous Deployment
continuous delivery is not to apply every change to
production immediately, but to ensure that every change is ready to go to
production.
Amazon Web Series, 2017
Qual a principal diferença?
O GitHub Actions permite que você crie fluxos de trabalho personalizados de ciclo de vida de desenvolvimento de software (SDLC, Software Development Life Cycle) diretamente no seu repositório do GitHub.
GitHub, 2020
Workflows são processos automatizados que podem ser configurados em seu repositório para construir, testar, empacotar ou implantar qualquer projeto (no Github).
É basicamente, um pipeline CI/CD
Já Self-Hosted Runners possibilitam mais controle do hardware, sistema operacional e ferramentas.
CHACON, Scott; STRAUB, Ben. Pro git. Apress, 2014.
DIAS, A. F. Conceitos Básicos de Controle de Versão de Software-Centralizado e Distribuído. 2011. 2013.
KREEFTMEIJER, Jeff. Using git-flow to automate your git branching workflow. 2015.
PRESTON-WERNER, Tom. Semantic Versioning 2.0.0. URL: https://semver. org, 2013.
SOMMERVILLE, Ian. Software engineering 9th Edition. ISBN-10137035152, 2011.