#git #gitlab #gitlab-ci #versioning
#git #gitlab #gitlab-ci #управление версиями
Вопрос:
В настоящее время я создаю версии сборки, используя
git rev-list --count --first-parent $BRANCH_NAME
как правило, с использованием ревизий ветвей master и dev, например 2.27
. При использовании конвейера cicd (gitlab) Мне пришлось бы снова проверять свой проект, что, по-видимому, излишне.
Есть ли простой способ получить номер редакции ветки, не проверяя ее сначала?
** РЕДАКТИРОВАТЬ **
Я обнаружил, что мой конвейер ci выполняет частичную проверку моего репозитория в качестве первого шага. Затем он проверяет текущую ветку в отсоединенном головном состоянии.
$ eval "$CI_PRE_CLONE_SCRIPT"
...
$ git branch # if run manually via script
* (HEAD detached at xxxxxx)
Это многообещающе, потому что это означает, что у меня больше доступа к поиску информации о других ветвях в репозитории
** Временное решение **
После запуска npm build
я выполняю скрипт узла для выполнения грязной работы:
...
execSync('git checkout -b __headless__'); // to get away from headless state, so we can come back in a sec @jkr
// const current = execSync('git rev-parse --abbrev-ref HEAD').toString();
execSync('git fetch origin master');
execSync('git checkout master');
const master = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync('git fetch origin dev');
execSync('git checkout dev');
const dev = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync(`git checkout __headless__`);
...
** Рефакторинг временного решения **
Вот что я в конечном итоге получил
const check = execSync('git branch').toString();
if(check.indexOf('detached at') > -1) {
execSync('git checkout -b __headless__'); // to get away from headless state, so we can come back in a sec @jkr
}
const current = execSync('git rev-parse --abbrev-ref HEAD').toString();
execSync('git fetch origin master');
execSync('git checkout master');
const master = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync('git fetch origin dev');
execSync('git checkout dev');
const dev = execSync('git rev-list --count --first-parent HEAD').toString().replace(/s/, '');
execSync(`git checkout ${current}`);
...
В какой-то момент я собираю master
dev
числа и и вводю их в качестве версии сборки.
Комментарии:
1. Как вы отслеживаете версию, вы используете теги?
git rev-list ...
В данном контексте это выглядит странно.2. Системы CI в целом сложны и раздражают. Но, как сказал Марек Р.,
git rev-parse <expression>
обычно простой способ решить конкретную проблему, о которой вы спрашиваете. Может ли ваша система CI действительно сделать это и использовать результат — это отдельный вопрос. 🙂
Ответ №1:
Мой проект использует теги для отслеживания версии. Итак, чтобы увидеть, из какой версии происходит ветка, я делаю:
git describe --tags "--abbrev=0" "--match=v*.*.*" branchName
Что делает то, что мне нужно.
Если информация о версии хранится в отслеживаемом файле, вы можете просмотреть ее таким образом:
git show branchName:current_version.txt
Я вижу, что вы использовали «версию» и «ревизию», и если под этим вы подразумеваете sha-1 фиксации, то это то, что вам нужно:
git rev-parse branchName