Automatizando o fluxo de trabalho de seu projeto Java com um modelo de ramificação Gitflow modificado

Automatizando o fluxo de trabalho de seu projeto Java com um modelo de ramificação Gitflow modificado



Principais conclusões



  • Gitflow é um modelo de ramificação colaborativa que tenta alavancar o poder, velocidade e facilidade de ramificação do Git. Esse método funcionou bem para a situação que descrevemos aqui, mas outros notaram que o uso do Gitflow tem seus próprios problemas.
  • A documentação para usar o Gitflow na postagem é confusa na melhor das hipóteses.
  • As funções são isoladas em ramos. Você pode gerenciar suas próprias alterações de recursos isoladamente. Essa abordagem difere do desenvolvimento baseado em tronco, onde cada desenvolvedor se compromete com a linha principal pelo menos uma vez a cada 24 horas.
  • Separar recursos usando ramificações isoladas permite que você decida quais recursos incluir em cada versão. A compensação aqui pode ser mesclagens complexas.





Atualização de 13 de fevereiro de 2019: o design inicial deste artigo recebeu muitos comentários, a maioria positivos e às vezes nem tanto. O principal ponto de discórdia era o uso do termo "entrega contínua" em um ambiente de liberação manual. Se você faz parte de uma equipe que implanta centenas de lançamentos por dia, nossa estrutura pode não funcionar para você. No entanto, se você, como nós, trabalha em um setor altamente regulamentado, como o financeiro, onde os lançamentos são mais controláveis ​​e deseja aproveitar ao máximo os recursos de ramificação, integração automática, hospedagem automática e controle de versão, esta solução também pode funcionar para você. quanto a nós



, «Git». , , : , SVN? . Git, .



Gitflow — , , Git. InfoQ, , , , . Gitflow 2010 « Git». Gitflow , , , . , , , , , .



Gitflow , , . , . — master, development, feature .., , , Snapshot, Dev, UAT, Prod ..?



, , , .



Java Maven, , . GitLab CI , Jenkins GitHub CI; Jira , IntelliJ IDEA IDE, Nexus , Ansible , .





, «» «» — , , ., . , , , « ». « », « »; , . - Thoughtworks , CI.



Gitflow



Gitflow feature . , , Git.





Git, «master»; «trunk», Git Git. Gitflow, , , .



Gitflow



Gitflow, , master «develop». develop , , , «».





, develop, master. Master — «» , , , , . - , .



develop "". , — , , ; . , , , , , "".



, ? :



Jira, . , , , master:





, «feat-», Jira. ( Jira, Epic Parent , .) , «feat-SDLC-123-add-name-field». «feat-» , CI- , . , . SDLC-123 — Jira, , .



: , , , . , , « (merge hell)».



, Snapshots



. , Sonatype Nexus. . «SNAPSHOT» semver ( ), «-SNAPSHOT» (, 1.2.0-SNAPSHOT). , «-SNAPSHOT» (, 1.2.0). Snapshot , , Snapshot, . ; , , , , Nexus.



, X, Y. , POM (, 1.2.0-SNAPSHOT). , Nexus, Nexus. , Nexus, 1.2.0-SNAPSHOT , ( , !) .



GitLab CI



, ! , ? GitLab CI, , Nexus, feat- Maven ( ), Maven ( Snapshot Nexus).



GitLab CI ( .gitlab-ci.yml) , CI / CD. , , .



GitLab CI , :



feature-build:
  stage: 
    build
  script:
    - mvn clean verify sonar:sonar
  only:
    - /^feat-\w+$/


, , , , .



,



. IntelliJ «», ( , ) , , . ( ) Maven (, Jacoco), . IDE, , , .





[ — , , , , . , ; , -, , . , .]



Maven. Maven ( , Test-something.java Test.java, Tests.java TestCase.java). Maven verifyphase ( Maven Failsafe) . mvn verify , , . SonarQube Maven SonarQube . .





Gitflow. , , «», . , , .



, GitLab, :







SDLC - , . , . , , , , . , , Nexus , POM, , . 0.0.0-SNAPSHOT POM, .



, , , , . , , SNAPSHOT Nexus.



develop. Gitflow ; . , , ( ), () , () , , . , 1.2.0, 1.2.1, Snapshot pom 1.2.1-SNAPSHOT. , 1.2.1.





GitLab CI , ( semver , ; : \d+\.\d+\.\d+). CI/CD POM, SNAPSHOT, (1.2.1-SNAPSHOT ).



release-build:
  stage:
    build
  script: 
    - mvn versions:set -DnewVersion=${CI_COMMIT_REF_NAME}-SNAPSHOT
    # now commit the version to the release branch
    - git add .
    - git commit -m "create snapshot [ci skip]"
    - git push
    # Deploy the binary to Nexus:
    - mvn deploy
  only:
    - /^\d+\.\d+\.\d+$/
  except:
    - tags


[ci skip] . , !



, CI POM, pom.xml ( , ). POM SNAPSHOT .



GitLab CI, (/^\d+\.\d+\.\d+$/, 1.2.1) , , push. GitLab mvn deploy SNAPSHOT Nexus. Ansible , . . , , -, SNAPSHOT, SNAPSHOT Nexus SNAPSHOT .



Ansible, . , , , cron . Ansible .



, , master, Git semver , Nexus .



, GitLab CI , , . jar Ansible, GitLab CI.



master-branch-build:
  stage:
    build
  script:
    # Remove the -SNAPSHOT from the POM version
    - mvn versions:set -DremoveSnapshot
    # use the Maven help plugin to determine the version. Note the grep -v at the end, to prune out unwanted log lines.
    - export FINAL_VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*')
    # Stage and commit the binaries (again using [ci skip] in the comment to avoid cycles)
    - git add .
    - git commit -m "Create release version [ci skip]"
    # Tag the release
    - git tag -a ${FINAL_VERSION} -m "Create release version"
    - git push 
    - mvn sonar:sonar deploy
  artifacts:
    paths:
    # list our binaries here for Ansible deployment in the master-branch-deploy stage
    - target/my-binaries-*.jar
  only:
    - master

master-branch-deploy:
  stage:
    deploy
  dependencies:
    - master-branch-build
  script:
   # "We would deploy artifacts (target/my-binaries-*.jar) here, using ansible
  only:
    - master




. , . (Develop , .)





, , . Master GitLab, , . GitLab master, SNAPSHOT . GitLab Maven : removeSnapshot. «-SNAPSHOT» POM, runner GitLab master, , POM SNAPSHOT Nexus. UAT QA UAT. , . ( Ansible, .)





hotfix



, . , , , . Hotfix . , . , , master.





. , hotfix Nexus SNAPSHOT UAT. , , master . Master Nexus.





:





, Gitflow. . , :



  • Feature . Feature , Feature, Feature,
  • Feature, , Feature . — , Feature, Feature.
  • , , .
  • , , .


, , . , . , , , .



Gitflow , , , .





Gitflow Atlassian Bamboo BitBucket . .



Gitflow Maven, , , Maven Gitflow. Gitflow.





Nomura Securities . Oracle Java, Java InfoQ Java.



Brian Gardner é graduado recentemente pelo Stevens Institute of Technology, onde obteve seu bacharelado e mestrado em ciência da computação. Brian atualmente trabalha na Nomura como Engenheiro de Software no Grupo de Desenvolvimento de Infraestrutura. Ele passa a maior parte do dia trabalhando em serviços de back-end Spring Boot ou pipelines de big data usando o Apache Spark.




All Articles