I, [2020-12-05T10:59:38.848743 #1] INFO -- : > cd /var/www/discourse && git remote set-branches origin v2.6.0
I, [2020-12-05T10:59:38.852600 #1] INFO -- :
I, [2020-12-05T10:59:38.852639 #1] INFO -- : > cd /var/www/discourse && git fetch --depth 1 origin v2.6.0
From https://github.com/discourse/discourse
* tag v2.6.0 -> FETCH_HEAD
I, [2020-12-05T10:59:41.405163 #1] INFO -- :
I, [2020-12-05T10:59:41.405307 #1] INFO -- : > cd /var/www/discourse && git checkout v2.6.0
error: pathspec 'v2.6.0' did not match any file(s) known to git
I, [2020-12-05T10:59:41.411796 #1] INFO -- :
Вместо ожидаемого вывода, который был при использовании коммита, предшествующего указанному выше:
I, [2020-12-05T11:22:14.717910 #1] INFO -- : > cd /var/www/discourse && git fetch origin v2.6.0
From https://github.com/discourse/discourse
* tag v2.6.0 -> FETCH_HEAD
I, [2020-12-05T11:22:15.672616 #1] INFO -- :
I, [2020-12-05T11:22:15.672683 #1] INFO -- : > cd /var/www/discourse && git checkout v2.6.0
Note: checking out 'v2.6.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at d6121249d3 Version bump to v2.6.0
Я бы не стал называть это багом как таковым, но мы хотим предоставить какие-то инструкции по установке старых версий Discourse, даже если это потребует использования более сложного шаблона или чего-то подобного.
Я согласен, что глубину следует сделать настраиваемой, возможно, через переменную окружения, по умолчанию «shallow», но с возможностью настройки через простую переменную окружения.
Я думаю, что проблема здесь в том, что теги неизвестны локально при выполнении checkout, как в следующем (не связанном с Discourse) вопросе:
Выполнение git fetch --all должно решить проблему, но я не знаю, насколько это увеличит размер образа (если только другая инструкция позже не очистит неиспользуемые ссылки).
Тем не менее, я считаю, что git clone --depth 1 https://github.com/discourse/discourse.git --branch=$version решит это, поскольку параметр branch поддерживает как ветки, так и теги, но я не тестировал это и не знаю, есть ли причина, по которой клонирование использует (в настоящее время) ветку master.
При выполнении git clone --depth 1 https://github.com/discourse/discourse.git --branch=v2.6.0 размер всей папки составляет 212 МБ, а папка .git внутри — 46 МБ, так что, думаю, это приемлемо.
Проблема в том, что на момент сборки образа я не знаю, какую ветку вы захотите использовать в будущем.
Текущая настройка была изменена для уменьшения размера образа, что позволило сократить его сжатый размер на 250 МБ (25%), что является огромным преимуществом. Это работает отлично при использовании обычных веток, таких как stable и beta или tests-passed.
В качестве обходного решения, если вы хотите переключиться на тег, вы можете применить это к вашему файлу app.yml:
Другим обходным решением является добавление ключа base_image на верхний уровень файла app.yml со значением старого базового образа. Поскольку мы даже не пытаемся поддерживать совместимость новых образов с запуском старых версий Discourse, это может быть необходимо, если вы возвращаетесь к очень старым версиям.
Вы правы, в тот момент мы не знаем версию. Похоже, базовый образ использует текущую версию + ветку tests-passed, хотя в ветке будет тот коммит, который был на момент сборки образа.
Не приводит ли текущий подход к более медленным пересборкам, даже при использовании ветки tests-passed?
Когда вызывается `git pull`, **извлекается весь репозиторий**, и это может занять несколько минут, так как ранее было выполнено только частичное клонирование. Вы можете попробовать выполнить только указанные выше инструкции локально и проверить.
Я не утверждаю, что наличие всего репозитория в базовом образе лучше, но код в `web.template.yml` будет выполняться при каждой пересборке, даже если был добавлен только плагин или изменена настройка в `app.yml`. Обычно в моих проектах (не связанных с Discourse) я создаю новый образ для каждой новой версии, но для вас это может быть нецелесообразно (учитывая ваш текущий подход).
Вы не замечали увеличения времени пересборки? (Или, возможно, это не так значительно по сравнению с общим временем пересборки в большинстве случаев?)
Обновление
Я снова протестировал описанные выше шаги, и они оказались быстрыми. Похоже, при первой попытке я выполнил другую команду, которая изменила дерево git, и в итоге при запуске git pull попыталось извлечь всё.
Да, я вижу, что после pull выполняется fetch и затем checkout в правильной ветке, поэтому, думаю, git pull не нужен (хотя я это не проверял).
Что касается тегов, похоже, что их всё ещё нужно подтягивать отдельно, но это вполне осуществимо. Кроме того, ветки используются чаще, поэтому теги, вероятно, будут скорее исключением из правила.
У меня возникает та же ошибка. Я использовал версию 2.5.1.
После этого я получаю следующую ошибку:
I, [2020-12-31T11:50:24.701475 #1] INFO -- : > cd /var/www/discourse && find /var/www/discourse ! -user discourse -exec chown discourse {} \+
chown: не удалось разыменовать '/var/www/discourse/public/plugins/styleguide': файл или каталог не существует
Спасибо за уточнение: это именно та часть, которой мне не хватало. Для тех, кто запутался так же, как и я, получение релизного тега Discourse можно выполнить следующим образом:
Убедитесь, что параметр versionне задан в app.yml, например: