Как предотвратить перезапись выпущенных артефактов (не моментальных снимков) в репозитории maven на hudson - PullRequest
7 голосов
/ 21 октября 2011

Описание проблемы

Рассмотрим случай, когда maven используется на hudson.

Теперь кто-то получил извлечение проекта, изменил некоторые файлы, но случайно использовал тот же идентификатор артефакта.и номер версии (без снимка).

Затем он / она собрал этот проект на hudson и установил maven. Модифицированный артефакт теперь находится в hudson .m2.Любой другой проект, который зависит от него, будет построен с измененным артефактом.Никто не узнает об этом, если компиляция не удастся.Несмотря на то, что правильный артефакт находится в центральном хранилище, он никогда не используется, потому что измененный извлекается из .m2, когда Хадсон начинает строить.

Поэтому я ищу способ предотвратить эту случайную человеческую ошибку.

  1. В любом случае, чтобы отозвать разрешения установки maven для версий без снимков (выпущенные артефакты) на hudson?
  2. Любой способ сравнить контрольные суммы .m2 в hudson и в удаленном центральном хранилище, чтобы ошибки контрольной суммы моглигенерировать предупреждения или сбой сборки?

Я уже проверил, что нет способа принудительно обновить версии без моментальных снимков из центрального хранилища, поскольку они должны быть неизменяемыми.

Очистка централизованногохранилище или использование отдельного хранилища для каждого задания в hudson приведет к увеличению времени сборки и использования дискового пространства соответственно.

Любая помощь будет принята.

Ответы [ 4 ]

1 голос
/ 06 декабря 2011

Вот как мы управляем версиями в нашем проекте:

Мы работаем над SNAPSHOT версией.В Jenkins у нас есть задание Fast Build , которое собирает и тестирует это приложение, но завершается неудачно, если версия не a SNAPSHOT.Это делает настраиваемый принудительный элемент (это противоположно обязательному исполнителю версии релиза ).

Когда мы хотим сделать выпуск, мы используем Jenkinsработа для этого.Используя параметризованную сборку и плагин релиза Maven , лицо, отвечающее за выпуск релиза, просто укажет версию релиза (стабильную версию), следующую SNAPSHOT версия, а также название тега SCM.Таким образом, только Jenkins будет определять стабильную версию, и разработчики всегда будут работать с кодом SNAPSHOT.

Но, конечно, это не мешает разработчикам делать то, что он хочет, на своей локальной машине.Но мы всегда рассматриваем одно надежное место: сервер Jenkins. Это работает на моей машине никогда не является хорошим решением проблемы; o)

1 голос
/ 28 августа 2012

Не было прямого способа решить эту проблему, но мы решили это косвенно, написав задание cron, которое запускается каждые пять минут и помечает все файлы, которые не являются SNAPSHOT, только для чтения в локальном хранилище Hundson.Таким образом, когда какой-то проект в Хадсоне пытается перезаписать его, моя установка mvn или развертывание mvn не приводит к перезаписи артефактов, поскольку они доступны только для чтения.

Любые новые артефакты, подлежащие выпуску, могут быть легко записаны.После написания в течение следующих пяти минут сценарий помечает их как доступные только для чтения.

Вот код для сценария unixmissions-handler.sh

#!/bin/bash
cd ~/.m2
date 2>&1>> permission-handler.out
find . -name '*jar' -type f | grep -v 'SNAPSHOT' | xargs chmod -vc 444 2>&1>> permission-handler.out
chmod 777 permission-handler.out

Также ведется ведение журнала, чтобы увидеть, какие все артефакты былипомечены как выпущенные.

1 голос
/ 21 октября 2011

Не думаю, что вы найдете способ остановить перезапись артефакта при установке.Сервер репозитория должен иметь параметр, предотвращающий развертывание обновленного артефакта выпуска.См., Например, «Как отключить перераспределение артефактов» для Nexus.

0 голосов
/ 12 октября 2015

Это решается путем настройки вашего репозитория Maven (например, Nexus, Artifactory), чтобы запретить перезапись выпусков репозитория. В Nexus у нас есть репозиторий для SNAPSHOT и один для релизов. Репозиторий SNAPSHOT позволяет перезаписывать. Но релиз репо не позволяет перезаписать. Это простая функция флажка в Nexus для этого репо. После того, как релиз-версия помещена в репо, она не может быть перезаписана. Работает очень хорошо.

...