Controle de Versão

Usando o Git e o AWS CodeCommit

A segunda etapa do processo consiste na conversão do diretório do site no computador local em um repositório Git local e o envio (push) do repositório Git local para o repositório do AWS CodeCommit.

AWS CodeCommit

O AWS CodeCommit é um serviço de controle de versões mantido pela Amazon Web Services (AWS), utilizado para armazenar e gerir bens (tais como documentos, código fonte, e ficheiros binários) na nuvem.

Para ser possível migrar um repositório local para o CodeCommit, primeiro deve-se criar e configurar um usuário no IAM (Identity and Access Management) para o CodeCommit e configurar o computador local para realizar o acesso. Um usuário do IAM é uma entidade criada na AWS para representar a pessoa, ou o aplicativo que o utiliza, que vai interagir com a AWS.

Instalar o AWS CLI

Deve-se, também, instalar a Interface de Linha de Comando da AWS (AWS CLI) para gerenciar o CodeCommit. Embora seja possível executar a maioria das tarefas do CodeCommit sem a sua instalação, o AWS CLI oferece flexibilidade ao se trabalhar com o Git na linha de comando ou no terminal.

Instalação no FreeBSD 13:

$ sudo pkg install awscli

$ aws --version
aws-cli/1.19.45 Python/3.7.10 FreeBSD/13.0-RELEASE botocore/1.20.45

Configurar o AWS CLI

O AWS CLI armazena a configuração numa profile (coleção de definições) no ficheiro de credenciais. A página Configuring the AWS CLI explica como definir as configurações que a Interface de Linha de Comando da AWS (AWS CLI) utiliza para interagir com a AWS. A página configure descreve as variáveis de configuração e a sintaxe do comando, mostrada abaixo:

aws configure [--profile profile-name]

Se o nome da profile não for especificado, receberá o nome default. Por padrão, é utilizada a informação neste perfil quando se executa um comando AWS CLI que não especifica explicitamente o perfil a ser utilizado.

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: sa-east-1
Default output format [None]: json

Criar o ajudante de credenciais

O AWS CLI inclui um ajudante de credenciais Git (credential-helper)[1][2] que pode ser utilizado com o CodeCommit. O ajudante de credenciais Git requer um perfil de credencial AWS, que armazena uma cópia do ID da chave de acesso AWS e da chave de acesso secreta AWS de um utilizador IAM (juntamente com um nome de Região AWS predefinido e um formato de saída predefinido). O ajudante de credenciais Git utiliza esta informação para autenticar automaticamente no CodeCommit, para que não seja preciso introduzir esta informação cada vez que se utiliza o Git para interagir com o CodeCommit.

$ cat ~/.aws/config
[default]
region = sa-east-1
output = json

$ cat ~/.aws/credentials
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

$ cat ~/.gitconfig
[credential "https://git-codecommit.sa-east-1.amazonaws.com"]
	helper = !aws codecommit credential-helper --profile default $@
	UseHttpPath = true
[credential "https://gitlab.com"]
	username = ExamPle
[user]
	name = ExamPle
	email = example@example.com
[http]
	sslVerify = true
[remote "origin"]
	proxy = socks5://127.0.0.1:9050
[gui]
	spellingdictionary = pt_BR
[init]
	defaultBranch = main

Criar o repositório

O repositório é o objeto fundamental do controle de versões no CodeCommit. É onde ficam armazenados em segurança o código e os arquivos do projeto. Também armazena o histórico do projeto, desde a primeira efetivação (commit) até às últimas alterações.

$ aws codecommit create-repository --repository-name docs --repository-description "Documentação Técnica"
{
    "repositoryMetadata": {
        "accountId": "955436647012",
        "repositoryId": "e260ff26-6c9f-4866-b3e0-d4680dd7f4bd",
        "repositoryName": "docs",
        "repositoryDescription": "Documentação Técnica",
        "lastModifiedDate": 1620826631.119,
        "creationDate": 1620826631.119,
        "cloneUrlHttp": "https://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs",
        "cloneUrlSsh": "ssh://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs",
        "Arn": "arn:aws:codecommit:sa-east-1:955436647012:docs"
    }
}

Migrar o conteúdo local para o repositório do CodeCommit

Aqui o diretório do site no computador local é convertido em um repositório Git local através do comando git init, que inicializa o controle de versão pelo Git neste diretório, depois é verificado o status, adicionados todos os arquivos ao controle de versão [3], registradas todas as mudanças e, por fim, utilizado o comando git push para enviar todos os arquivos do repositório local para o repositório do CodeCommit especificado pelo URL.

# Usar, por padrão, o nome "main" para o ramo principal
$ git config --global init.defaultBranch main
# Inicializar o repositório
$ git init
# Mostrar o status do repositório
$ git status
# Adicionar todos os arquivos do repositório ao índice
$ git add .
# Registrar as mudanças no repositório
$ git commit -a -m "Initial commit"
# Carregar o repositório local no repositório do CodeCommit
$ git push https://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs --all

Atualizar o repositório

Após serem efetuadas novas modificações no repositório Git local, estas modificações devem ser refletidas no repositório do CodeCommit.

$ git add . --verbose
add 'config.toml'
add 'content/hugo/criacao.md'
add 'content/hugo/versao.md'
add 'layouts/shortcodes/plaintext.html'
add 'static/css/chroma.css'
add 'static/css/docs.css'

$ git commit -a -m "Documentação do Hugo"
[main d34129b] Documentação do Hugo
 6 files changed, 1078 insertions(+), 10 deletions(-)
 rewrite content/hugo/criacao.md (74%)
 create mode 100644 layouts/shortcodes/plaintext.html
 create mode 100644 static/css/chroma.css
 create mode 100644 static/css/docs.css

$ git push https://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs --all
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 4 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 6.46 KiB | 6.46 MiB/s, done.
Total 14 (delta 0), reused 0 (delta 0), pack-reused 0
To https://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs
   5621849..d34129b  main -> main

Clonar o repositório

O repositório local é criado no subdiretório do diretório onde o comando é executado.

$ git clone https://git-codecommit.sa-east-1.amazonaws.com/v1/repos/docs docs

Notas

  1. credential.helper especifica um ajudante externo a ser chamado quando uma credencial de nome de utilizador ou senha é necessária; o ajudante pode consultar o armazenamento externo para evitar pedir ao utilizador as credenciais. Este é normalmente o nome de um ajudante de credenciais com possíveis argumentos, mas também pode ser um caminho absoluto com argumentos ou, se precedido por !, comandos shell. Note que podem ser definidos múltiplos helpers
  2. credential.useHttpPath especifica que ao obter as credenciais, deve ser considerado o componente “caminho” de um URL http ou https como sendo importante. O padrão é falso.
  3. Os arquivos que não serão rastreados pelo controle de versão devem ser especificados no arquivo .gitignore. O diretório /public do site não deve ser rastreado pelo controle de versão.