anúncios

Mostrando postagens com marcador Redmine. Mostrar todas as postagens
Mostrando postagens com marcador Redmine. Mostrar todas as postagens

quinta-feira, 13 de novembro de 2025

Workflow de branches em projetos ágeis: Boas práticas com Git Flow

Gerenciar branches de forma organizada é uma das práticas mais importantes em qualquer equipe de desenvolvimento. Um bom fluxo de versionamento garante rastreabilidade, previsibilidade nas entregas e reduz conflitos durante o ciclo de vida de cada Sprint.

Baseado no modelo Git Flow, o workflow que apresento aqui é uma adaptação moderna e prática, utilizada amplamente no mercado em equipes que trabalham com metodologias ágeis e ferramentas como Redmine, Jira, Trello ou GitHub/GitLab Issues.

  1. Estrutura principal do repositório
  2. O repositório segue duas principais linhas de desenvolvimento:

    • master ou main:
    • contém o código estável e homologado, pronto para produção.

    • develop:
    • linha de integração onde as novas funcionalidades e correções de Sprint são validadas antes da liberação.

    A partir dessas duas branches centrais, todo o ciclo de desenvolvimento é organizado.

  3. Criando branches de task (feature)
  4. Cada nova task atribuída no sistema de gestão deve originar uma branch seguindo um padrão de nomenclatura padronizado. Isso facilita a rastreabilidade da entrega, especialmente quando o time é grande ou o projeto possui várias sprints paralelas.

    O padrão recomendado é:

    feature/sprintX/RTCY/TituloDaTask

    Essa branch deve sempre ser criada a partir da branch develop atualizada, garantindo que a task comece sobre a base mais recente do projeto:

    git checkout develop
    git pull origin develop
    git checkout -b feature/sprint5/RTC102/ImplementarAutenticacaoOAuth

    Isso cria a branch da task a partir da develop atualizada.

  5. Commits e Pull Request (PR)
  6. Durante o desenvolvimento da task, os commits devem ser claros e objetivos, refletindo o progresso da implementação e dos testes unitários.

    Ao concluir a task, realize o commit e o push final:

    git add .
    git commit -m "Finaliza implementação e testes unitários da autenticação OAuth"
    git push origin feature/sprint5/RTC102/ImplementarAutenticacaoOAuth

    Em seguida, abra um Pull Request (PR) para a branch develop e utilize o seguinte padrão de comentário:

    [SPRINT5][RTC102][ImplementarAutenticacaoOAuth][feature]

    Isso ajuda o time de revisão e o QA a identificar rapidamente o contexto da entrega.

  7. Correção de bugs encontrados pelo QA
  8. Caso o QA identifique algum bug durante os testes da Sprint, o desenvolvedor deve corrigir o problema na mesma branch da feature, mantendo o histórico da entrega.

    Ao abrir um novo Pull Request ou atualizar o existente, utilize o seguinte padrão de comentário:

    [SPRINT5][RTC102][ImplementarAutenticacaoOAuth][bug] Correção na validação do token

    Esse formato indica que a PR refere-se a uma correção derivada da mesma task principal, mantendo o controle e a rastreabilidade no fluxo da Sprint.

  9. Correções de bugs em produção
  10. Para bugs que ocorrem em produção, a abordagem é diferente.

    Essas correções devem ser baseadas diretamente na branch master ou main, garantindo que a correção seja aplicada sobre o código em execução.

    A nomenclatura segue o padrão:

    feature/bugfix/RTCX

    Por exemplo:

    feature/bugfix/RTC240

    Crie a branch, aplique a correção, teste e envie o Pull Request de volta para a branch principal (master ou main).

    Após aprovação e merge, é possível gerar uma tag de hotfix, caso necessário.

  11. Encerramento da Sprint e versionamento
  12. Ao final de cada Sprint, com todas as tasks revisadas e integradas à develop, é hora de gerar uma tag de versão.

    A tag identifica o encerramento formal da Sprint e serve como ponto de referência no histórico do repositório.

    O padrão sugerido é:

    git tag -a v1.5 -m "Sprint 5 concluída"
    git push origin v1.5

    Esse versionamento facilita auditorias, rollback e acompanhamento de evolução entre as versões.

  13. Benefícios desse workflow
  14. Seguir esse modelo de workflow traz diversas vantagens:

    • Clareza e rastreabilidade das entregas por Sprint.
    • Redução de conflitos de merge.
    • Facilidade na revisão de Pull Requests.
    • Histórico limpo e versionamento controlado.
    • Organização entre desenvolvimento, QA e deploy.

Bugfix Branch: Deve ir apenas para main ou também para develop?

Na maioria dos fluxos Git profissionais, incluindo Git Flow, GitHub Flow e variações híbridas bastante usadas em equipes Java/Spring/Quarkus, existe uma regra importante:

Todo bugfix criado a partir da main deve ser incorporado também à develop, caso ela exista.

Por quê?

Porque a branch develop geralmente contém novas features ainda não liberadas.

Se você corrigir o bug apenas na main, o problema voltará a aparecer quando a develop for integrada no futuro release, causando regressão.

Isso significa:

Criar a branch de bugfix a partir da main atualizada

Porque o bug ocorre na versão em produção.

Porque main representa o código estável.

Abrir Pull Request para main

A hotfix corrige imediatamente a versão produtiva.

Depois da aprovação, fazer merge dessa correção também para develop

Existem duas formas comuns:

PR automático do GitHub (bot cria PR de main -> develop)

Ou o desenvolvedor abre manualmente um PR de sincronização

Isso é opcional?

Não, é considerado convencional e altamente recomendado sempre que o time utiliza uma branch develop.

Ignorar isso pode gerar os seguintes problemas:

Reintrodução do bug ao fazer merge de develop em release futuro.

Divergência de código entre main e develop.

Dificuldade de rastreamento, pois hotfixes não aparecem no histórico da release em desenvolvimento.

Considerações finais

Um bom gerenciamento de branches é mais do que uma convenção, é parte essencial da cultura de engenharia de software madura.

Trabalhar com um workflow bem definido baseado no Git Flow permite que o time mantenha consistência, colabore com eficiência e entregue software de qualidade em ciclos ágeis.

Ao aplicar esse processo com disciplina, cada Sprint se torna mais previsível, e o código entregue ganha estabilidade e confiabilidade, o que é o verdadeiro objetivo de um ciclo de desenvolvimento profissional.

Feito!

quarta-feira, 29 de junho de 2022

Instalando e Configurando o Redmine no ambiente Docker

O objeto deste post, é explicar os procedimentos de instalação e configuração do Redmine no ambiente Docker.

O que é Redmine?

Redmine é uma ferramenta que auxilia o gerenciamento de projetos, um software livre. Contém o calendário e gráficos de Gantt para representação visual dos projetos e seus deadlines. Permite também trabalhar com múltiplos projetos.

Instalação e configuração

A premissa é ter o Docker e Docker-Compose instalados, caso ainda não tenha, verifique Instalando Docker e Docker Compose no Linux (qualquer distro) ou Instalando Docker no Windows 10

$ mkdir $HOME/redmine
$ cd $HOME/redmine
$ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-redmine/master/docker-compose.yml > docker-compose.yml

PS: Para utilizar no servidor de produção, é recomendado é recomendado alterar a variável ALLOW_EMPTY_PASSWORD de "yes" para "no" e definir um password seguro para o SGBD MySQL utilizado no Redmine e o usuário administrador de acesso ao Redmine.

Adicionar as variáveis REDMINE_USERNAME e REDMINE_PASSWORD para um nome de usuário e password que irá gerenciar o Redmine.

$ docker-compose up -d

Aguarde subir o ambiente, após concluir, abre o browser e acesse http://localhost

No primeiro acesso, o username/password default são: user/bitnami. Caso tenha alterado o username/password default no arquivo docker-compose.yml, então utilize o que você definiu.

Após o acesso do Redmine, pode inserir os projetos e seus deadlines. Inicialmente faça um overview para experimentação e depois projetos reais.

Feito!

domingo, 23 de agosto de 2015

Instalando e Configurando Redmine no Debian

O que é o Redmine ?

Redmine é um software livre, gerenciador de projetos baseados na web e ferramenta de gerenciamento de bugs. Ele contém calendário e gráficos de Gantt para ajudar na representação visual dos projetos e seus deadlines (prazos de entrega). Ele pode também trabalhar com múltiplos projetos.

O design do Redmine foi influenciado pelo Trac, um pacote de software semelhante.
O Redmine é escrito usando o framework Ruby on Rails. Ele é multiplataforma e suporta diversos banco de dados e possibilita o uso integrado com vários repositórios de versionamento de código fonte, tais como: SVN, Git, CVS.

Depois de conhecer o Redmine e pra que serve, podemos seguir os procedimentos de instalação e configuração do Redmine em seu servidor GNU/Linux Debian.

Observação: Testado no GNU/Linux Debian 8 (Jessie) e versão atual do Redmine é 3.1.0 até a data de publicação deste post.

Atualizando o repositório de pacotes
#apt-get update
Instalando os pacotes pré-requisitos necessários
#apt-get install rubygems, libopenssl-ruby libmysql-ruby libapache2-mod-fcgid libapache2-mod-passenger ruby libnet-ssh-ruby1.8 python-setuptools librmagick-ruby1.8 mysql-server libmysqlclient15-dev libmagickcore-dev libmagickwand-dev ruby-dev

Download do Readmine
Opcional: Salvo em /usr/src/

$wget -c "www.redmine.org/releases/redmine-3.1.0.tar.gz"
#tar -xzvf redmine-3.1.0.tar.gz -C /usr/src/

Habilitar os módulos abaixo no Apache
#a2enmod fcgid
#a2enmod passenger

Reinicie o servidor Apache
# /etc/init.d/apache2 restart
[ ok ] Restarting web server: apache2 ... waiting ....
Instalar o Rails
# gem install rails --version 4.0.0
Aguarde... É demorado essa parte.
Definição do banco de dados utilizado no Redmine, nesse caso será utilizado o MySQL.
#cd /usr/src/redmine-3.1.0/config
Renomeia o arquivo database.yml
#mv database.yml.example database.yml
Editar o arquivo database.yml com as informações (database, username, password) do banco criado anteriormente.

#vim database.yml
5 production:
6 adapter: mysql2
7 database: redmine
8 host: localhost
9 username: redmine
10 password: "senha_redmine"
11 encoding: utf8

Criando o banco de dados para o Redmine no MySQL
# mysql_install_db
# mysql -u root -p
Enter password: < digite a senha de root que foi definida na instalação do MySQL > Criar o banco de dados redmine
mysql> create database redmine character set utf8;
Criar o usuário redmine para o banco readmine
mysql> GRANT ALL PRIVILEGES ON *.* TO redmine@localhost IDENTIFIED BY 'senha_redmine' WITH GRANT OPTION; Query OK, 0 rows affected (0.15 sec)
mysql> quit

Instalação do bundler
#gem install bundler
#cd /usr/src/redmine-3.1.0
Nesse caso será instalado o Redmine sem os bancos PostgreSQL e SQLite, o banco utilizado é MySQL configurado anteriormente.

# bundle install --without postgresql sqlite development test
Log execução do bundle install. Um pouco demorado essa parte.
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Resolving
dependencies.....................................................
Using rake 10.4.2
Using i18n 0.7.0
Installing json 1.8.3 with native extensions
Installing minitest 5.8.0
Using thread_safe 0.3.5
Installing tzinfo 1.2.2
Installing activesupport 4.2.3
Installing builder 3.2.2
Using erubis 2.7.0
Installing mini_portile 0.6.2
Installing nokogiri 1.6.6.2 with native extensions
Installing rails-deprecated_sanitizer 1.0.3
Installing rails-dom-testing 1.0.7
Installing loofah 2.0.3
Installing rails-html-sanitizer 1.0.2
Installing actionview 4.2.3
Installing rack 1.6.4
Using rack-test 0.6.3
Installing actionpack 4.2.3
Installing globalid 0.3.6
Installing activejob 4.2.3
Installing mime-types 2.6.1
Installing mail 2.6.3
Installing actionmailer 4.2.3
Installing actionpack-action_caching 1.1.1
Installing actionpack-xml_parser 1.0.2
Installing activemodel 4.2.3
Installing arel 6.0.3
Installing activerecord 4.2.3
Using bundler 1.10.6
Installing coderay 1.1.0
Using thor 0.19.1
Installing railties 4.2.3
Installing jquery-rails 3.1.3
Installing mysql2 0.3.19 with native extensions
Installing net-ldap 0.3.1
Installing protected_attributes 1.1.3
Installing ruby-openid 2.3.0
Installing rack-openid 1.4.2
Installing sprockets 3.3.2
Installing sprockets-rails 2.3.2
Installing rails 4.2.3
Installing rbpdf 1.18.6
Installing redcarpet 3.1.2 with native extensions
Installing request_store 1.0.5
Bundle complete! 28 Gemfile dependencies, 45 gems now installed.
Gems in the groups postgresql, sqlite, development, test and rmagick were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Criar um token para sessão
#rake generate_secret_token
Criar as tabelas do banco de dados e popular a base de dados
RAILS_ENV=production rake db:migrate
RAILS_ENV=production REDMINE_LANG=pt-BR rake redmine:load_default_data


Acessar o diretório onde fez a instalação do Redmine, nesse caso é: /usr/src/redmine-3.1.0
cd /usr/src/redmine-3.1.0
Setando as devidas permissões do Redmine
#chown -R www-data:www-data files log tmp public/plugin_assets
#chmod -R 755 files log tmp public/plugin_assets


Startar o Redmine
# ruby script/rails server webrick -e production
script/rails no longer exists, please use bin/rails instead.
Se aparecer a mensagem acima, então fazer como sugere na mensagem.
# ruby bin/rails server webrick -e production
=> Booting WEBrick
=> Rails 4.2.3 application starting in production on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-19 22:04:11] INFO WEBrick 1.3.1
[2015-08-19 22:04:11] INFO ruby 1.9.3 (2012-04-20) [i486-linux]
[2015-08-19 22:04:11] INFO WEBrick::HTTPServer#start: pid=24768 port=3000
Teste no navegador: http://localhost:3000 ou http://ip-ou-nome-servidor:3000
Username: admin
Password: admin

Criando um script para inicialização automática
Por padrão o Redmine não inicializa o servidor WEBrick. Então será necessário criar um script para inicializá-lo sempre que o sistema operacional for iniciado.
Dentro do diretório /etc/init.d crie um arquivo com o nome redmine.sh, seta a permissão para a execução e adicione o conteúdo conforme abaixo:

#vim /etc/init.d/redmine.sh
#!/bin/bash
cd /usr/src/redmine-3.1.0
ruby bin/rails server webrick -e production
ESC + :x (sai e salva do editor Vim).
Em seguida adicione o script nos diretórios de inicialização com o seguinte comando:
#update-rc.d redmine.sh defaults 99
Screenshot Redmine em execução

Feito!