Aquest how-to va dirigit principalment al personal tècnic (desenvolupadors i arquitectes) que treballin amb Git com a eina de control de versions de codi font.
El SIC disposa d’un repositori Git (anomenat d’ara en endavant “Git del SIC” o “SIC” directament) on emmagatzemar i centralitzar les versions lliurables del codi.
Amb anterioritat ja es va publicar un article “SIC. Branca Master al Git del SIC” referent a quina era la metodologia recomanada per a utilitzar el Git del SIC. I tot i que en aquest article es recomana l’ús de trunk-based (o master-based), ja que és la forma més natural de fer-ho en relació amb la filosofia del SIC actual, també és possible aplicar GitFlow en un Git de desenvolupament tenint en compte com es faria el pas al Git del SIC posteriorment.
En aquest context, el workflow de treball proposat es compon de 2 repositoris:
Un cop definits els 2 repositoris, el seu nom i rols, el mètode proposat per a treballar de manera integrada amb el SIC, és seguir el workflow estàndard de GitFlow: una branca develop amb la línia de desenvolupament principal, i una branca master amb la línia de desplegaments a PRO.
IMPORTANT: Aquest pas dóna per fet que el codi que hi ha al repositori gencat és més nou (i té precedència) respecte el repositori origin, es recomana fer un backup (o stash) abans de continuar.
git remote add gencat https://12345678A@git.intranet.gencat.cat/0123/ABC.git --tags -f -m master
git reset --hard ; git checkout -f
git pull --all
git checkout -t -b master-gencat gencat/master
# merge inicial
git checkout master # origin/master
git merge --allow-unrelated-histories -Xtheirs master-gencat
git push
#
El workflow d’integracions de canvis és el següent: gencat/master -> origin/master -> origin/develop
git reset --hard ; git checkout -f
git pull --all
#
git checkout master # origin/master
git merge master-gencat
git push
#
git checkout develop # origin/develop
git merge master
git push
El workflow de desenvolupament més popular per a treballar amb Git és GitFlow. Hi ha publicada molta documentació al respecte, i exposarem aquí únicament la metodologia aplicada a desenvolupament de noves funcionalitats (el cas més comú).
sudo apt-get install git-flow
git flow init -d
# Normalitzar el nom de la branca (p.e. a partir d’una tasca JIRA)
_FEATURE="INTEMO-1234 - Normalitzar i definir el procediment per a treballar amb l'eina de desenvolupament Git"
_FEATURE=$(echo $_FEATURE | sed -e 'y/ÀÁÈÉÌÍÒÓÙÚÜÇçÑñàáèéìíïòóùúü/AAEEIIOOUUUCcNnaaeeiiioouuu/' -e 's:[^-0-9A-Za-z]:_:g' -e 's:_\{2,\}:_:g' -e 's:^_::' -e s:_el_:_:g -e s:_l_:_:g -e s:_amb_:_:g -e s:_i_:_:g -e s:_-_:-:g -e 's:_$::' | cut -c-80)
git pull origin
git reset --hard ; git checkout -f
git checkout develop
git flow feature start $_FEATURE
git pull origin
git commit -a
git flow feature publish && git flow feature finish && git push
Es pot crear una nova release del codi, aquesta però no podrà tenir el mateix format que la versió de l’aplicació ja que dins de les etapes de desplegament en l’Integració continua del SIC ja s’inclou la generació automàtica del tag de build i del tag definitiu en base a la versió de l’aplicació.
_RELEASE="Release 1.0.0"
git flow release start $_RELEASE
// Un cop s'han integrat canvis d'última hora de DEVELOP (si escau)
git flow release finish $_RELEASE
git push --tags
El workflow d’integracions de canvis és el següent: origin/develop -> origin/master -> gencat/master
git reset --hard ; git checkout -f
git pull --all
#
git checkout master # origin/master
git merge develop
git push
git push --tags
#
git checkout master-gencat # gencat/master
git merge master
git push gencat master
git push gencat master --tags
El HowTo dóna per fet que es disposa d’un codi repositat amb Git però pot donar-se el cas que el codi no sigui així. Aquest annex adreça aquesta situació.
Per inicialitzar el repositori s’ha de seguir les següents passes (bash):
die () {
echo ERROR $*
exit $1
}
do_repo_git_init () {
# carpeta temporal de treball
local _CARPETA_GIT_NOU=/tmp/repogitnou
rm -fr $_CARPETA_GIT_NOU 2>/dev/null
mkdir -p $_CARPETA_GIT_NOU || die 1 # crea la carpeta temporal de treball
cd $_CARPETA_GIT_NOU || die 2
echo ">> Ara s'ha de copiar el codi del projecte en aquesta carpeta : $_CARPETA_GIT_NOU <<"
echo "Premi INTRO per a continuar..." && read
git init || die 3
cat>>.gitignore<<EOF
.settings/
.project
.classpath
bin/
target/
EOF
git status
}
do_repo_git_init