У нас есть ветка с именем sonar-scan
(например, ветка функций), где конфигурация, связанная с SonarQube, присутствует в конвейере azure-pipelines.yml
, поэтому эту ветку нельзя объединить с веткой develop
из-за уникальных конфигураций.
Но нам всегда нужны последние версии кода/коммитов из ветки разработки, чтобы SonarQube их сканировал. Однако только ветка sonar-scan
должна работать на локальном агенте Ubuntu (VMSS) из-за требований безопасности, поэтому нет возможности использовать пулы агентов по умолчанию в отличие от других ветвей. Кроме того, может возникнуть конфликт слияния, поскольку оба azure-pipelines.yml
теперь имеют разные конфигурации.
Я пытался реализовать простой git-скрипт внутри ветки sonar-scan
, но, к сожалению, пока безуспешно.
Вероятно, git ведет себя в Azure DevOps иначе, чем локально.
- script: |
git fetch origin
git checkout develop
git pull origin develop
git checkout feat/sonar-scan
git pull origin feat/sonar-scan
git merge develop --no-commit --no-ff --allow-unrelated-histories || true
// Tries to solve conflicts by keeping 'azure-pipelines.yml' from the sonar-scan branch as it is
// --ours flag wants keep the version of .yml file in sonar-scan branch, like stash or staging
git checkout --ours azure-pipelines.yml
git add azure-pipelines.yml
// Complete the merge
git add .
git commit -m "Auto-merge latest changes from develop"
git push origin feat/sonar-scan
displayName: 'Checkout and merge branch'
Ссылка: https://marketplace.visualstudio.com/items?itemName=ShaykiAbramczyk.CreatePullRequest
В настоящее время эта задача работает только на компьютерах с Windows.
Как решить вышеуказанную проблему и найти оптимальное решение?
Итак, требуется вытащить код из ветки develop
и сохранить azure-pipelines.yml
без изменений в sonar-branch
?
@AlvinZhao-MSFT -> Да, это правильно. Всегда объединяйте ветку «разработка» с веткой «сонарное сканирование». Не наоборот. Разработчик будет использовать ветку «sonar-scan» только для проверки проблемы с кодом. И это была опечатка, поэтому название ветки — «sonar-scan».
Работает ли у вас конвейер YAML?
@AlvinZhao-MSFT -> Во-первых, спасибо за ваши искренние усилия. Что ж, частично это сработало, но он не может перенести последний код в ветку функций. Поэтому переименовал «azure-pipeline.yml» в *-sq.yml и создал отдельный новый конвейер из нового файла *-sq.yml. Он также создает 2 совершает. Дополнительную информацию я добавляю под ответом.
Насколько я тестировал, предыдущий рабочий процесс может переносить как вновь созданные, так и обновленные файлы из ветки develop
в sonar-branch
и сохранять azure-pipelines.yml
в sonar-branch
без изменений.
Непонятно, почему изменения в вашем файле index.html
из ветки develop
не удалось объединить с веткой sonar-branch
, но вы также можете попробовать описанный ниже рабочий процесс, как мы обсуждали.
newsonar
на основе последнего коммита в ветке develop
;
sonar.yml
с тем же содержимым, что и файлы azure-piplines.yml
из sonar-branch
, чтобы выполнить те же шаги сканирования SonarQube в пуле агентов VMSS;
sonar.yml
;
develop
готов к сканированию, вы можете создать PR для объединения изменений/коммитов из ветки develop
в ветку newsonar
;
sonar.yml
существовал только в ветке newsonar
и, следовательно, в этом файле не было конфликтов;sonar.yml
в ветке newsonar
; и не трогайте остальные файлы в ветке newsonar
, так как изменения в них всегда должны быть перенесены из ветки develop
.Учитывая требование объединить код из ветки develop
и сохранить azure-pipelines.yml
в sonar-branch
без изменений, вы можете попробовать приведенный ниже скрипт, определенный в файле azure-pipelines.yml
из sonar-branch
.
steps:
- checkout: self
clean: true # To make sure no legacy left in the System.DefaultWorkingDirectory that may affect the git commands in each run, since running in self-hosted agent pool.
fetchDepth: 0 # Disable shallow fetch to keep the related history between branches
persistCredentials: true
- script: |
git config --global user.email "$(Build.RequestedForEmail)"
git config --global user.name "$(Build.RequestedFor)"
echo "================ 1. Checkout sonar-branch =============== = "
git checkout -b sonar-branch
echo "================ 2. Fetch develop =============== = "
git fetch origin develop
echo "================ 3. Merge develop into sonar-branch =============== = "
git merge -X ours --no-commit origin/develop
echo "================ 4. Restore azure-pipelines.yml from sonar-branch =============== = "
git checkout sonar-branch -- azure-pipelines.yml
echo "================ 5. Commit the merge =============== = "
git commit -m "Merge develop into sonar-branch, excluding azure-pipelines.yml"
echo "================ 6. Push the merge to remote sonar-branch =============== = "
git push origin sonar-branch
displayName: 'Merge develop into sonar-branch and push'
Совсем забыл, что не могу сюда добавлять скриншоты, поэтому попробую объяснить. Поэтому мне все еще не удалось получить последний код из файла ветки разработки (index.html): GIT LOGS ---> Автоматическое слияние index.html Автоматическое слияние прошло хорошо; остановлен перед фиксацией по запросу
В этом файле тоже есть конфликты?
К счастью, конфликтов в файле и конвейере не произошло successful
Итак, конвейер прошел успешно, но обновление в файле index.html не было перенесено из ветки разработки в ветку сонара, верно?
Как насчет этого обходного пути. Создайте новую ветку, скажем newsonar
, на основе последнего коммита в ветке develop
-> Создайте новый файл sonar.yml
с вашими работами сонара (то же содержимое, что и в файле azure-pipeline.yml
из sonar-branch
) -> Создайте новый конвейер с файлом sonar.yml
в ветке newsonar
. Это позволит избежать переименования коммитов в одном и том же файле azure-pipeline.yml
.
Правильный. Бывший. только что добавил комментарий в ветку develop
, но файл index.html в ветке sonar-scan
не обновлен.
Давайте продолжим обсуждение в чате.
Извини, @kishorK, я сейчас не на работе. Я продолжу работу над этим вопросом завтра во время своей смены. Спасибо за ваше время и усилия.
еще раз я ценю ваши усилия. Однако я отправил ответ в приватный чат? ты все еще можешь получить доступ к чату?
Обновил ответ с помощью clean; true
, как мы обсуждали. Приятно работать с вами и большое спасибо за усилия и обмен информацией.
Спасибо за ваше время и навыки. Всегда приятно с вами работать. @Элвин
Рассматривали ли вы возможность создания нового конвейера, ссылающегося на другой файл
.yml
вsonar-branch
? Поскольку нетsonar.yml
из веткиdevelop
, не будет конфликтов, когда PR объединяет код из веткиdevelop
вsonar-branch
для сканирования.