Anatoliy
Но... конфиг для кубера там тоже будет?
Shamil
Пока это изучи, многое прояснится в ходе.
Shamil
У тебя примерно такой пайплайн получится: 1. сборка go 2. публикация артефактов 3. запуск контейнера дженкинсом, с этими артефактами, тестирование 4. пуш Dockerfile в git, 5. сборка Docker образа. Дальше уже другой пайплайн стартует.
Shamil
Ну можешь в один объеденить, но лучше чтобы через контроль версий проходило.
Shamil
https://www.pluralsight.com/courses/docker-ansible-continuous-delivery может помочь
Serega
а зачем "5. пуш Dockerfile в git" ?
Shamil
а зачем "5. пуш Dockerfile в git" ?
Перепутал шаги (-:
Shamil
Ну то есть сперва dockerfile пушится в гит, и только увидев это, дженкинс дальше идет собирать сам образ.
Serega
ну как бы докерфайл один раз написали и он не меняется. А меняется код. 12 факторов же
Shamil
Если версионирование контейнеров не идет, или конфиги никогда не меняются, то можно и так. В зависимости от ситуации, это уже кто как.
Serega
стоп, у нас уже есть репозиторий, в нем код, Dockerfile, (Jenkinsfile|.travis.yml|Makefile) и т.д. при пуше каких-либо изменений в репу, стартует CI\CD. Запускаются сборка, тесты, упаковка артифакта в докер имедж, тесты, пуш в реджистри, (и опционально деплой в различные среды). Версия докеримеджа может быть привязана к git tag, branch name, commit hash и т.д. Мне лично git tag нравится.
Shamil
Вообще образы хорошо бы версионировать — в любой момент потом можно будет вернуться. Просто дженкинс может вешать тег с версией, после интеграционного тестирования и перевешивать тег latest.
Shamil
Тогда на образ потом тоже тег ляжет и кубик сам тебе latest поднимет, прямо не отходя от кассы.
Serega
это все понятно. Не понятно для чего пушить что-либо в репозиторий в процессе сборки.
Shamil
Ну да, я не так выразился, надо было написать: "вешает метку"
Serega
имелся в виду docker tag ?
Anatoliy
У тебя примерно такой пайплайн получится: 1. сборка go 2. публикация артефактов 3. запуск контейнера дженкинсом, с этими артефактами, тестирование 4. пуш Dockerfile в git, 5. сборка Docker образа. Дальше уже другой пайплайн стартует.
Эм... вообще у меня все это дело через дженкинс идет. Т.е. в шаге 1 я беру из репы код потом я его собираю дальше я тестирую что получилось. потом нужно уже собрать образ дальше - запушить его в реджистри и в конце - уже деплоим в кубере И все это в одном поде которые стартует от дженкинса
Shamil
Просто чувак как то задействовать дженкинс в деплойменте на кубик, а он там по идее не нужен.
Anatoliy
Хорошо, а как тогда можно убрать последний шаг? ведь куберу надо сообщить что версия появилась новая?
Anatoliy
я думал что дженкинс должен просто выполнить что-то типа kubectl apply -f deployment.yaml где прописан будет нужный образ из реджистри. и всё. дальше уже сам кубер все доделает
Shamil
И staging
Anatoliy
ну пусть там будет latest, но kubectl apply все равно надо сделать?
Anton
latest тэг при деплое путь к беде
Shamil
Там rc сам должен увидеть, что тег поменялся и все сделать сам.
Anton
как то лучше фиксировать, по git commit hash \ git tag
Shamil
latest на проде конечно не надо...
Anatoliy
ну понятно что там не именно latest, но я не понимаюб как сказать куберу что пора проверять что там что-то обновилось в образе
Shamil
@Visteras ты просто можешь запускать дженкинсовские джобы в кубике, если хочешь сборку и все такое делать не на самом дженкинсе, тебя, наверное, это сбило с толку.
Anatoliy
Это replication controller сам увидит.
откуда? он что, дергается постоянно реджистри на новые версии?
Anton
я вообще не уверен что если не форсить always pull политику для имейджей применение latest поверх latest хоть что то стригерит
Anton
в общем поэтому я и говорю что latest или prod или еще что то там фиксированное в качестве тэга для docker image плохо. нужно отличать один деплой от другого. если по git tag - то пускай будет prod-<date> какой нить, чтобы все явно было
Anton
хотя бы по такому тегу можно понять однозначно какой именно код у тебя в имейдже
Shamil
Тебе что тегов жалко, вешай хоть десять разных
Shamil
Ты не меняешь теги в данном случае, а снимешь тег, с одного образа и вешаешь его на другой. RC это точно увидит.
Салтыдык
кубер не сможет понять, что тэг обновился. Где-то в доке это говорится (не использовать latest). Мой процесс: у меня есть установка с нуля (деплой манифестов) и на каждый CI\CD я просто делаю kubectl set image. Не понимаю что вы тут за велосипеды изобретаете. Тэги на образы пока делаю коротышами от SHA-коммита.
Салтыдык
Anatoliy
Да, верно, только так. + поду нужно удалить чтобы триггер на пулл сработал
не нужно, у меня само обновляет если я обновил стаейтфул. думаю деплоймент так же может
Салтыдык
я именно про деплоймент и говорю, не сможет кубер понять обновилось на той стороне что-то или нет
Anatoliy
т.е. что-то вроде kubectl apply -f deployment.yaml
Алексей
именно так
Салтыдык
если тэг имиджа не меняется, то обновлением деплоймента ничего не произойдёт
Anatoliy
вот, потому тег меняется. но что надо сделать что бы после сборки, тестов, создания образа и пуша его в реджистри дженкинс мог выполнить kubectl ?
Anatoliy
Как добавить kubectl в контейнер агента дженкинса в котором все собирается?
Алексей
измени имидж контейнера с агентом дженкинса, установи туда kubectl
Shamil
Как добавить kubectl в контейнер агента дженкинса в котором все собирается?
Ну ты же просто запускаешь там заданый под, поставь чтобы в этом поде был нужный образ и все...
Салтыдык
Как добавить kubectl в контейнер агента дженкинса в котором все собирается?
с дженкинсом не сталкивался, слишком тяжёлый он. использую докер-контейнер для деплоя (alpine + kubectl)
Shamil
Но это не то, что тебе нужно.
Anatoliy
Shamil
Ты просто стартуешь в поде jenkins-слейв, а это не то...
Салтыдык
значит надо обновить деплоймент, так?
варианты: 1) политика пулла Always, использовать статический тэг (latest), удалением поды вызывается репулл. 2) использовать тэги на каждый деплой. kubectl set image
Shamil
Зачем тебе его запускать, я никак не могу понять?
Shamil
кого?
jenkins-slave
Anatoliy
https://pastebin.com/c9GHGTyF Сейчас pipeline выглядит так
Anatoliy
Не самый лучший вариант но все понятно
Салтыдык
https://pastebin.com/c9GHGTyF Сейчас pipeline выглядит так
с постоянным go get можно и инфаркт получить, особенно со старыми проектами. Используй менеджер зависимостей
Anatoliy
с постоянным go get можно и инфаркт получить, особенно со старыми проектами. Используй менеджер зависимостей
это понятно, меня сейчас интересует что дальше длжно быть что бы можно было собрать образ, запушить его в локальный реджистри и потом обновить кубер
Салтыдык
go build -i -o auth && mv auth /go/bin/auth легко превращается в go install
Anatoliy
go build -i -o auth && mv auth /go/bin/auth легко превращается в go install
это тоже понятно. а вот что дальше должно быть? в последних двух шагах?
Салтыдык
не разбираюсь в дженкинс, по этому не могу уловить суть проблемы
Салтыдык
это тоже понятно. а вот что дальше должно быть? в последних двух шагах?
docker build -t image:git-sha1 . docker push image:git-sha1 kubectl set image container-name=image:git-sha1
Anatoliy
говорю же, кури docker-build-step а купик прямо так дергай.
как его "прямо так дернуть"? docker-build-step я гляну, сейчас просто не имею возможности. а вот как кубцтл получить при сборке - я не понимаю. там же нужен конфиг, его откуда брать?
Салтыдык
в gitlab-ci можно запихнуть сертификат и конфиг в переменные окружения, не знаю можно ли так в дженкинс. Либо сделать готовый имидж с конфигом и авторизацией
Anatoliy
Хм.. вообще - умеет. В общем буду думать. Конфигов же может быть несколько? Я про то что я могу сгенерить новый и использовать его? И потом если что просто убить?
Shamil
https://plugins.jenkins.io/kubernetes а ты, видимо, вот это смотришь, вот это не то (-:
Anatoliy
Да, действительно возможно именно так. Вечером обязательно проверю
Anatoliy
https://plugins.jenkins.io/kubernetes-cd вот так "прямо так"
То что вы советуете работает если item не pipeline а "свободная конфигурация". в pipeline его просто нет
Anatoliy
так что опять вернулись к чему было - не понятно как это сделать(