Наверняка если вы начали читать эту статью, то знаете что такое git и для чего он нужен. НО не все используют такую важную функциональность в git как submodules.
Это интересная штука, которая дает вам возможность прицепить к вашему проекту другие проекты и переиспользовать их в вашем. Для примера рассмотрим такой репозиторий
Теперь вернемся к смыслу статьи, то что после @ является ссылкой на указатель коммита, на который ссылается ваш основной проект: для примера если перейти по ссылке за ansible
все в принципе здорово, но иногда так случается, что связка основной git репозиторий и git подмодуль ломается.
Для примера что необходимо сделать чтобы проект сломался и вернул вам ошибку типа такой?
hudson.plugins.git.GitException: Command "git submodule update --init --recursive vault" returned status code 1: stdout: stderr: |-----------------------------------------------------------------| | This system is for the use of authorized users only. | | Individuals using this computer system without authority, or in | | excess of their authority, are subject to having all of their | | activities on this system monitored and recorded by system | | personnel. | | | | In the course of monitoring individuals improperly using this | | system, or in the course of system maintenance, the activities | | of authorized users may also be monitored. | | | | Anyone using this system expressly consents to such monitoring | | and is advised that if such monitoring reveals possible | | evidence of criminal activity, system personnel may provide the | | evidence of such monitoring to law enforcement officials. | |-----------------------------------------------------------------| fatal: reference is not a tree: 63f0d683a3842bc6bffc13524803560e1e725086 Unable to checkout '63f0d683a3842bc6bffc13524803560e1e725086' in submodule path 'vault'
необходимые условия возникновения ошибки:
- "тривиальная структура" проекта: есть репозиторий с кодом на python кастомного модуля мониторинга node_exporter для prometheus, который требуется собрать в docker image и задеплоить: Dockefile и deployment.yml соответственно в docker и ansible папках
CICD лежит в отдельном репозитории, в котором есть Jenkinsfile, описывающий конвейер инициализации, сборки, загрузки артифакта pip wheel в репозиторий Jfrog Artifactory и дальнейший деплое в определенную среду dev/test/preprod/prod .
Важный нюанс в Jenkinsfile подгружаются Stage из других репозиториев которые связаны с основным git submudule зависимостью. Для примера
далее обстоятельства:
- 22:00 пятница и вы хотите получить именно сегодня результат, потому как потратили на этот pipeline почти целый день, просто уйти и бросить задачу - вы не только не получите свою дозу дофамина, а у вас еще выработается дополнительная доза кортизола,
- в какой-то момент вы видите, что вот оно почти готово и своему коллеге по работе который почему-то тоже задержался вы говорите еще 30 минут и мы пойдем,
- на 25 минуте у вас получилось наконец-то полностью доделать pipeline и протестировать deployment.yml и теперь осталось дело за малым раскомментировать stage с build и протестировать снова и в процессе внести косметическое изменение в проект в ansible и vault, вы нормально коммитите в соответствующие репозитории и на основном проекте выполняете
git submodule update --init --recursive && git status && git submodule update --remote --rebase && git commit -am 'Fix old commit' && git push origin master
Перечисление объектов: 3, готово.
Подсчет объектов: 100% (3/3), готово.
При сжатии изменений используется до 12 потоков
Сжатие объектов: 100% (2/2), готово.
Запись объектов: 100% (2/2), 241 bytes | 241.00 KiB/s, готово.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
To gitlab.services.ru:product/adv/cicd.git
f20bf06..2fa5cc7 master -> master
но что-то идет не так и когда вы запускаете Job в Jenkins возвращается ошибка и если в git перейти по ссылке то будет как-то так
Для примера подобные ошибки на toster.ru
Такое к сожалению иногда случается, когда у тебя есть несколько ссылающихся друг на друга repo и необходимо знать как это быстро починить.
Первое что мы делаем
git clone <repo>
далее необходимо сделать
git submodule init
Подмодуль «vault» (git@gitlab.services.ru:DevOps/cicd-store/jenkins/vault.git) зарегистрирован по пути «vault»
далее выполняем рекурсивный update
git submodule update --recursive --remote
далее пробуем выполнить update именно sub модуля vault
git submodule update --init --recursive vault
получим в ответ
| This system is for the use of authorized users only. |
| Individuals using this computer system without authority, or in |
| excess of their authority, are subject to having all of their |
| activities on this system monitored and recorded by system |
| personnel. |
| |
| In the course of monitoring individuals improperly using this |
| system, or in the course of system maintenance, the activities |
| of authorized users may also be monitored. |
| |
| Anyone using this system expressly consents to such monitoring |
| and is advised that if such monitoring reveals possible |
| evidence of criminal activity, system personnel may provide the |
| evidence of such monitoring to law enforcement officials. |
|-----------------------------------------------------------------|
fatal: git upload-pack: not our ref 63f0d683a3842bc6bffc13524803560e1e725086
fatal: ошибка внешнего репозитория: upload-pack: not our ref 63f0d683a3842bc6bffc13524803560e1e725086
Получен по пути подмодуля «vault», но не содержит 63f0d683a3842bc6bffc13524803560e1e725086. Сбой при прямом получении коммита.
переходим в каталог vault и проверяем та ли ветка которая нужна мы сейчас используем
cd vault
git branch
* (HEAD отделён на bf2f348)
v1
далее выполняем актуализацию
git checkout v1
Переключено на ветку «v1»
Ваша ветка обновлена в соответствии с «origin/v1».
мы обновили каталог с sub modules до последнего коммита repo с vault, теперь необходимо перейти в каталог с основным проектом и сохранить изменения
git commit -am 'Fix old commit with vault'
[master 37b2fa0] Fix old commit with vault
1 file changed, 1 insertion(+), 1 deletion(-)
далее зафиксированные изменения мы отправляем в репозиторий с проектом
git push origin master
|-----------------------------------------------------------------|
| This system is for the use of authorized users only. |
| Individuals using this computer system without authority, or in |
| excess of their authority, are subject to having all of their |
| activities on this system monitored and recorded by system |
| personnel. |
| |
| In the course of monitoring individuals improperly using this |
| system, or in the course of system maintenance, the activities |
| of authorized users may also be monitored. |
| |
| Anyone using this system expressly consents to such monitoring |
| and is advised that if such monitoring reveals possible |
| evidence of criminal activity, system personnel may provide the |
| evidence of such monitoring to law enforcement officials. |
|-----------------------------------------------------------------|
Перечисление объектов: 3, готово.
Подсчет объектов: 100% (3/3), готово.
При сжатии изменений используется до 12 потоков
Сжатие объектов: 100% (1/1), готово.
Запись объектов: 100% (2/2), 249 bytes | 249.00 KiB/s, готово.
Total 2 (delta 1), reused 1 (delta 1), pack-reused 0
To gitlab.services.ru:product/adv/cicd.git
1e35cdf..37b2fa0 master -> master
проверяем repo с проектом, что все сработало как нужно
переходим по ссылке после @
если до этого мы все сделали правильно то ссылка должна открыться.