Это, пожалуй, будет самая короткая моя статья. Более того, сама идея очевидная.

Часто в WEB проектах возникают задачи доставки статики на прод вне релизов. Например, нужно выложить файлы для SPA с маркетинговой информацией: актуальные комиссии, свежий FAQ и т.п.

У нас генерировались такие файлы из админки. Затем они разливались rsync-ком по нодам. Недостатков такого решения уйма. Организация логирования и контроль прав доступа, одни из самых серьезных.

Однажды пришла идея использовать git для доставки маркетинговой статики на прод. Т.е. файлы все также генерируются в админке, затем они автоматом комитятся под пользователем, который их сгенерировал и пушатся в отдельную, маркетинговую репу.

А далее, работает привычная магия CI/CD git.

Более того, теперь нам доступны профиты о которых даже не думали — автоматический контроль фактического исполнения задач маркетингом через интеграцию Jira и gitlab.

Комментарии (26)


  1. Koneru
    15.04.2019 15:09

    Что нового несёт эта заметка кэпа?


    1. tsukasa_mixer
      15.04.2019 15:12
      +2

      Ну как минимум информационный повод поболтать.
      А вообще подобный метод, почему-то часто все игнорируют или считают чем-то сродним с чумой.


    1. rpiontik Автор
      15.04.2019 15:14

      Без сарказма. Вы можете привести пример такой реализации на боевом проекте? Лично я, перед таем как запостить, потратил время на вопросы знакомым DevOps. И… не встретил такой реализации. Но все же, идея настолько проста и очевидна, что я ее отнес к лайфхакам и, заметьте, не претендую на новизну.


      1. aamonster
        15.04.2019 15:36

        Почти наверняка её и нет на боевых проектах. А для маленького свечного заводика — идея действительно кажется простой и очевидной (другой пример из той же серии – хранение конфигов в системе контроля версий)


        1. rpiontik Автор
          15.04.2019 15:47

          Хм… а в чем проблема для больших проектов? Деплой фронта же делается именно Ci/CD гита, так в чем трудность деплоить ту же статику, только не от девелоперов, а от маркетинга?


      1. arandomic
        15.04.2019 15:37

        А почему вы считаете,

        файлы все также генерируются в админке, затем они автоматом комитятся под пользователем, который их сгенерировал и пушатся в нужную репу. А далее, работает привычная магия CI/CD git.

        не релизом?


        1. rpiontik Автор
          15.04.2019 15:49

          Потому, что релиз это совокупность фич, которые прошли цикл разработки от бизнес-запроса, до тестирования.
          А этот процесс не имеет признаков релиза. И называется просто — публикация. Ну требует оперативного выкатывания на прод. Т.е. в любой момент по желанию бизнеса.


      1. eugene_bx
        15.04.2019 16:24
        +2

        Для статических файлов (около ста тысяч файлов, обновление не очень частые, несколько сотен в день) у нас есть подобная система для большого проекта (миллионы пользователей в день), только вместо git у нас TFS.


      1. YemSalat
        15.04.2019 20:27

        Главное папочку .git не забыть закрыть от публики на сервере.


        1. Stanislavvv
          16.04.2019 10:06

          Для этого достаточно пуллить не в публичный каталог и выкладывать обновлённое хуками.


          1. multiadmin
            16.04.2019 14:49
            +1

            Для этого хуки не нужны. Можно указать расположение рабочего дерева (worktree) или через переменную окружения GIT_WORK_TREE, или через свойство core.worktree, или ключом --work-tree.


            1. Stanislavvv
              16.04.2019 17:46

              Тоже вариант, но хуками можно ещё и заполнять темплейты, данные в которых зависят от места деплоя. Не всем надо, конечно.


  1. rezdm
    15.04.2019 15:45

    Идея-то стара — выгребать статику через сорс-контол, например давно известная «дырка» (точнее человекческая ошибка):
    www.adamgotterer.com/post/28125474053/hacking-the-svn-directory-archive

    Вопрос скорее технический, как вы чекаутите из гита отдельный файл (директорию)?


    1. rpiontik Автор
      15.04.2019 15:52

      Простите, не понял вопроса. Про отдельный файл. Почему отдельный?


      1. rezdm
        15.04.2019 15:58

        >> У нас генерировались такие файлы

        Я так понял, что вы генерируете некую статику в виде надобра файлов, потом git add && git commit && git push в нужной комбинации, далее на серваке делаете pull/… что-то ещё, чтобы собстно выложить эти файлы (изменения в файлах) на веб.
        Вопрос — что вы пуллите/чекаутите на веб?


        1. rpiontik Автор
          15.04.2019 16:05

          Не совсем так.
          1. git pull (получаем текущее состояние определенного бранча для данной задачи)
          2. Перегенерируем все файлы. Все.
          3. git add.
          4. git commit -m "[тут инфа от маркетинга из админки о причинах]"
          5. git push

          Для простого случая это все. Далее запускается pipeline гита.

          Про серверную инфру, простите, детально рассказать не могу, но по сути это git pull. Т.е. все, что нужно заливается и мы имеем крайний комит в продакшене.


          1. rezdm
            15.04.2019 16:15

            >> Про серверную инфру, простите, детально рассказать не могу
            Так это самое интересное.

            >>по сути это git pull
            Это подразумевает клон репозитория на веб-сервере, что есть не совсем гуд. Собстно об этом и вопрос.

            Вот это вот всё:
            stackoverflow.com/questions/1125476/retrieve-a-single-file-from-a-repository
            stackoverflow.com/questions/2466735/how-to-sparsely-checkout-only-one-single-file-from-a-git-repository/33578380


            1. rpiontik Автор
              15.04.2019 16:17

              Я все понимаю, но не могу раскрывать детали прода. Прошу понять меня верно. Могу только одно сказать — там все хорошо. И строгое молчание о деталях прода, один из принципов нашей безопасности. Концепция доставки ничем, по сути, не отличается от концепции доставки релизов. И не несет рисков безопасности.


              1. rezdm
                15.04.2019 16:34

                Эээ, странная позиция, как по мне. Ну да ладно.


              1. staticlab
                16.04.2019 09:03
                +2

                И строгое молчание о деталях прода, один из принципов нашей безопасности.

                Security through obscurity?


                1. rpiontik Автор
                  16.04.2019 09:30

                  Включая.


          1. multiadmin
            15.04.2019 17:33

            Про серверную инфру, простите, детально рассказать не могу, но по сути это git pull

            А как выглядит рабочая копия? Служебный каталог ".git" прямо внутри web-каталога или лежит отдельно?

            Просто не все знают, что служебный каталог ".git" и файлы рабочей копии можно разнести, используя «core.worktree». И не засорять web-каталог служебными каталогами.


            1. rpiontik Автор
              15.04.2019 18:02

              Git на проде нет. Так отвечу. И даже намека на него нет.
              rsync на прод из админки нарушал гармоничную концепцию изолированности контуров. С переходном на транспорт git проблема решилась сама собой.

              Это не значит, что внутри контура мы отказались от rsync.


  1. MrFrizzy
    15.04.2019 16:07

    Ну, или перефразируя предыдущий вопрос: а у вас код и статика лежат в одном репозитории, или в разных?


    1. rpiontik Автор
      15.04.2019 16:07

      Теперь понял. Разные.


  1. neenik
    15.04.2019 18:24

    Посмотрите hugo (gohugo).