Этот пост был первоначально опубликован на ср, 24 марта, 2021 года в cloudwithchris.com .
Некоторое время я использовал действия GitHub для обновления содержимого моего веб-сайта (I.E. Страницы, описания, метаданные и т. Д.). Через Hugo эти обновления контента автоматически обновляют RSS-каналы. Это затем заставляет эпизоды появляться в службах подкаста, такие как Apple Podasts, Google Podasts и Spotify. Однако в течение всего времени я был вручную загрузить файлы подкаста на мою учетную запись хранилища. Это не было значительным накладным расходом, но я продолжал думать, что должен быть лучший способ сделать это. И, есть — я реализовал это! Этот пост блога прогулят вас, почему я сделал эти изменения, как я их сделал и в этом результате.
Там есть смешанные мнения на хранении больших двоичных файлов непосредственно в репозитории Git. Как новый пользователь, клонирующий репозиторий, я должен сбить каждый бинарный файл, который был загружен. Таким образом, если бы я хотел внести свой вклад в репозиторий с моей локальной машины, и есть десятки или сотни подводных аудиофайлов, то я должен скачать все из них, чтобы сделать мои изменения. Это требует больше пропускной способности, больше времени для скачивания, и в конечном итоге требуется больше места на машине конечного пользователя, когда это скорее всего не нужно.
Введите Git LFS. Git Большой хранилище файлов (LFS) Это расширение открытого источника для Git, который фокусируется на версиях больших файлов. Как это работает? Это на самом деле довольно просто. Вместо того, чтобы хранить двоичный файл непосредственно в репозиторий Git, он хранит текстовый файл, содержащий указатель на удаленное место. Какое удаленное место? Двоичный файл, который вы изначально хотел версию! (Кстати, если вы предпочитаете что-то более визуальное — у меня есть краткое 5-минутное вступление доступно здесь !)
Хорошо, дорогая, пользователь — как вы настроите с Git LFS? Сайт Git LFS, который я связал выше, объясняет это действительно хорошо, но я объясню это в контексте случая моего использования немного дальше. Во-первых, я скачал расширение показано на сайте Git LFS И последовали соответствующие шаги установки (например, для Windows есть файл .exe, для моей среды Ubuntu WSL, мне пришлось добавить новый репозиторий и использовать APT-Get, чтобы загрузить двоичные файлы). После установки вы можете идти вперед и запустить команду Git LFS Install.
. Это одноразовый шаг, необходимый для вашей локальной учетной записи пользователя.
Отлично, теперь в этот момент — Git LFS установлен на вашем локальном компьютере. Но как вы гарантируете, что ваш репозиторий на самом деле использует GIT LFS? Эти следующие шаги должны будут завершены на основе на основе репозитории Отказ Другими словами, для каждого хранилища, где вы хотите использовать GIT LFS. В вашем локальном хранилище Git используйте команду ниже:
git lfs track "*.mp3"
Вышеуказанная команда позволяет нам отслеживать все MP3-файлы, которые привержены для хранилища с этой точки, используя GIT LFS. Значение, как только они нажаты в удаленное местоположение, они не будут храниться непосредственно в репозитории Git, но будут выгружены на удаленный магазин/удаленный сервер и будут заменены в Git с помощью файла текстового указателя. Прежде чем вы продвигаете изменения, вам необходимо убедиться, что вы добавили папку. Гитаттрибусов в свой репозиторий, используя Git Add .Gitattributes.
. Почему это важно? Посмотрите на содержимое моей папки cloudwithchris.com .gitattributes. Это то, что используется для хранения деталей того, что GIT LFS отслеживает.
*.mp3 filter=lfs diff=lfs merge=lfs -text
Прежде чем мы будем двигаться дальше, давайте также соблюдаем одну важное нюанс в моей формулировке выше. Вышеуказанная команда позволяет отслеживать все файлы MP3, которые привержены для хранилища С этого момента награды используя git lfs. Итак, как насчет наших исторических коммитов/файлов, которые могут сопоставить тип файла, мы хотим отслеживать (в этом случае MP3)? К счастью, есть Git LFS мигрирует Команда доступна для этой цели, и есть Много подобных дискуссий над переполнением стека Отказ
После моих исследований в том, как все это работает, мне было удобно, что файлы MP3 будут отслеживаться соответствующим образом. Это была точка, где я привел Папка PODCACT_AUDIO в мою локальный репозиторий Git и добавил содержимое папки для устойчивого/преданного. Рабочий процесс не отличается от добавления или совершения любого другого файла Git, благодаря метаданным в папке .gitattribute.
git add podcast_audio git commit -m "Add Podcast Audio to repository" git push origin main
Как вы, вероятно, узнаете уже — мой Удаленный репозиторий размещен на Github Отказ Вы сможете увидеть пример того, что это выглядит как здесь , но также включает пример изображения ниже для читабельности. Обратите внимание, что файл в Github теперь говорится ?| Хранится с Git LFS ? Вот как мы знаем, мы настроили его соответствующим образом!
Отлично, это шаг 1 сделано — получение файлов в репозиторий. Теперь, как насчет процесса загрузки тех, кто к моей учетной записи хранения, для www.cloudwithchris.com. ? Ну, еще раз — это довольно легко решить. Мы можем использовать обычный подход, который у нас с действиями GitHub, например Push или Pull rrquest триггер в ветку нашего выбора. В конце концов, как мы говорили ранее — мы сможем обнаружить, что в репозитории есть изменения файла (файлы текстовых указателей).
Первоначально я собрал наивную реализацию для решения этого —
name: "Podcast Audio Upload" on: push: branches: - master paths: - "podcast_audio/**" jobs: publish: environment: name: production.azure url: https://www.cloudwithchris.com runs-on: ubuntu-latest env: PODCAST_AUDIO_LOCATION: $GITHUB_WORKSPACE/podcast_audio steps: - uses: actions/checkout@v2 with: lfs: true fetch-depth: 1 - name: Azure Login uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: "Upload podcast files to storage that don't yet exist" uses: azure/CLI@v1 with: azcliversion: 2.20.0 inlineScript: | az storage blob upload-batch --account-name cloudwithchrisprod -d 'podcasts' -s ${{ env.PODCAST_AUDIO_LOCATION }} --if-unmodified-since 2020-01-01T00:00Z
Крис, это выглядит, чтобы сделать работу. Вы запускаете рабочий процесс, когда есть изменение в папке PODCACT_AUDIO, нажатой к главной ветке. Вы также включили флаг LFS, так что бегун будет продолжаться и потянуть двоичные файлы по мере необходимости. Почему это наивная реализация? Я рад, что вы спросили! В качестве пользователя GitHub у вас есть квота для хранения и пропускной способности для данных GIT LFS. Вы можете найти это в Раздел биллинга вашего аккаунта GitHub.
После моего начального толчка я в значительной степени вытер всю свою квоту с точки зрения хранения и пропускной способности. Как вы заметите с помощью скриншота — я плачу 5 долларов в месяц на 1 пакет данных. Для меня преимущество оптимизации моего процесса и дополнительной стоимости стоит дополнительных временных инвестиций в управление ручными загрузками. Я на самом деле пропустил загрузку в несколько файлов MP3 эпизодов со временем! Помните, что у меня также есть Youtube и другие платформы, чтобы позаботиться, и это все сделано в моем свободное время и усилия общины!
Так что возвращаясь к точке, почему этот рабочий процесс наивен? Каждый раз, когда рабочий процесс работает, он собирается загрузить все файлы MP3, удерживаемых в репозитории. Не подмножество. Не только те, которые изменились с момента последнего фиксации. Все mp3 файлы. Что это значит? У меня растущая проблема. Когда я загружаю все больше и больше MP3 файлов со временем, я собираюсь поесть на этой квоте. Вы заметите, что скриншот сказал, что я использовал 18,28 ГБ моего пакета данных 50GB. Мои mp3 файлы не что Большой, как вы увидите из громкости хранения в строке выше на скриншоте. Через проверку этого рабочего процесса с тестируемыми MP3 стало ясно, что это не собирается масштабировать. Каждый раз, когда я запускаю рабочий процесс, я собираюсь потреблять объем пропускной способности, равной размере хранения GIT LFS хранилища хранилища в то время. Мне нужен способ оптимизировать этот рабочий процесс, чтобы вытащить только файлы, которые изменились и игнорируют остальные. Я сделал ложное предположение о том, что действие Checkout Github будет иметь дело с этой проблемой, и только тянет дельту изменений LFS.
На данный момент, что делает любой хороший технолог? Проконсультируйтесь с другими для руководства и учиться на их опыте! Я разместил об этом в Twitter, но не получил большую часть ответа. Я думал, что это интригует, что побудило меня смотреть в проблему еще дальше.
После копания в Оформить проверку действий из github Казалось, что не было набора свойств, которые я мог бы изменить, чтобы сделать именно то, что я хотел. К счастью, Действия GitHub позволяют использовать набор композитных шагов запуска (модный способ сказать запустить несколько шагов от командной строки). Затем я сломал проблему в серию ступеней, немного как псевдокод.
- Сначала загрузите копию репозитория, но не выбирая большие двоичные файлы — просто извлечь указатели.
- Определите, какие аудиофайлы изменялись в фиксирующемся, который запускал рабочий процесс для запуска.
- Удалите эти аудиофайлы из локального репозитория и снова оформируйте репозиторий без каких-либо исключительных (I.E. Загрузить файлы MP3 и не указатели). Это один из важных шагов. Я снова проверяю репозиторий. На этот раз GIT обнаруживает, что уже есть несколько файлов и загружают только отсутствующие файлы. До этого заказа мы удалили исключение/фильтр файлов GIT LFS, поэтому он загрузит большие файлы вместо текстовых указателей.
- Удалите аудиофайлы в локальном репозитории, которые не изменились. Это служит пару целей —
- Предотвращение рабочего процесса случайно перезаписать ранее загруженные файлы MP3 с помощью файлов указателя в качестве замены
- Оптимизация шага Чтобы загрузить файлы подкаста для хранения Azure. В наивенной реализации я обнаружил, что это заняло много времени, чтобы запускать оценку условий на каждом файле (в некоторых случаях рабочий процесс занял более 10 минут, чтобы запустить файлы 50 или около того, что бы снова было бы растущей проблемой) Отказ Как сравнение, я недавно загрузил два эпизода содержания облачных капель. Рабочий процесс Audio MP3 Audio потребовался менее 50 секунд, чтобы полностью выполнить.
Так что давайте доберемся до хорошей части! Как этот рабочий процесс выглядит сейчас? Вы можете Посмотрите на репозиторий GitHub Для новейших и величайших, но вот снимка его во время написания —
name: "Podcast Audio Upload" on: push: branches: - master paths: - "podcast_audio/**" jobs: publish: environment: name: production.azure url: https://www.cloudwithchris.com runs-on: ubuntu-latest steps: - name: Download Podcast files that are different from prior commit run: | git clone --config lfs.fetchexclude="/podcast_audio" https://github.com/chrisreddington/cloudwithchris.com.git ./ fileschanged=$(git diff --name-only HEAD^ HEAD -- '*.mp3') echo "$fileschanged" > files.txt xargs -a files.txt -d'\n' rm git config --unset lfs.fetchexclude git checkout . cd podcast_audio sed -i -e 's/podcast_audio\///g' ../files.txt for i in *; do if ! grep -qxFe "$i" ../files.txt then echo "Deleting: $i" rm "$i" fi done - name: Azure Login uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: "Upload podcast files to storage that don't yet exist" uses: azure/CLI@v1 with: azcliversion: 2.20.0 inlineScript: | az storage blob upload-batch --account-name cloudwithchrisprod -d 'podcasts' -s '/github/workspace/podcast_audio' --if-unmodified-since 2020-01-01T00:00Z --auth-mode login
И с этим у меня есть рабочий процесс, который автоматически зарабатывает измененные файлы MP3 на мою учетную запись Azure. Для хорошей меры у меня всегда есть условия одобрения вручную. Я также принял возможность обновления до последней и величайшей версии Azure CLI, что также позволило мне воспользоваться Функциональность контроля доступа на основе роли Azure для хранения данных. который недавно был введен. Я ценю, что я, вероятно, могу принять это еще дальше, но это касается основной обеспокоенности, которую я имел — создание автоматизированного рабочего процесса, а не только для моего сайта, но и для файлов MP3, которые являются плотно связанными частью этого процесса развертывания для подкаста содержание. Я смог оптимизировать для пропускной способности/хранения данных GIT LFS, а также уменьшающуюся время, которое требуется для запуска этого действия GitHub в целом.
Так что ты думаешь? Является ли это вызов, что вам нужно, а также решить? Можете ли вы увидеть это применение в других сценариях? Я знаю, что люди в сообществе имеют смешанные мнения на Git LFS (например здесь и здесь ), но это, безусловно, работает на моем сценарии. Дайте мне знать свои мысли и опыт над в твиттере — Я хотел бы обсудить дальше!
Вот и это за блог на этой неделе. До следующего, пока на данный момент!
Оригинал: «https://dev.to/cloudwithchris/using-git-lfs-to-version-podcast-audio-files-and-trigger-releases-to-production-with-github-actions-he2»