Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
#Круги добра
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр «Дурак подкидной и переводной» — классика карточных игр! Яркий геймплей, простые правила. Развивайте стратегию, бросайте вызов соперникам и станьте королем карт! Играйте прямо сейчас!

Дурак подкидной и переводной

Карточные, Настольные, Логическая

Играть

Топ прошлой недели

  • SpongeGod SpongeGod 1 пост
  • Uncleyogurt007 Uncleyogurt007 9 постов
  • ZaTaS ZaTaS 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
3
pytker
9 месяцев назад
Лига Devops

Очередной пайплайн сборки для вашего приложения⁠⁠

Статья была написана в январе 2023 и выложена на сайте которого уже нет. Дабы она не канула в лету выкладываю ее здесь.

В этой статье описан “универсальный” пайплайн для сборки golang приложений. Универсальный в кавычках, потому что для сборки десятков разных приложений при помощи одного пайплайна нужно придерживаться  общих стандартов разработки. Которые как бывает не всегда соблюдаются даже в рамках одного проекта.

Шаги сборки


Ниже описаны шаги которые могут присутствовать в вашем пайплайне, которые должен пройти ваш код для попадания из тестовой ветки в прод. В данной статье будут рассмотрены примеры реализации шагов выделенных жирным шрифтом.

  • Получение кода;

  • Запуск тестов;

  • Статический анализ кода;

  • Сборка кода;

  • Сборка докер образа:

  • Деплой деплой образа в registry;

  • Деплой приложения на тестовую среду;

  • Запуск интеграционных тестов;

  • Запуск нагрузочного тестирования;

  • Запуск любых дополнительных проверок которые вы посчитаете нужными;

  • Деплой на прод.

Инструменты


Для реализации пайплайна будут использоваться следующие инструменты:

  • Jenkins - для запуска пайплайна;

    • generic webhook trigger plugin

    • pipeline plugin

    • ssh agent plugin

    • sonarqube scanner plugin

  • Harbor - для хранения docker образов;

  • Sonarqube - для статического анализа кода;

  • Github - для хранения исходников.

В статье не описано развертывание jenkins, harbor, SonarQube.

Пайплайн будет написан при помощи jenkins declarative pipeline.

Сборка будет производится на примере node_exporter

Требования к jenkins нодам

На нодах jenkins должны быть установлены:

  • git;

  • docker;

  • java.

Получение кода.

Для доступа к репозиторию нужно сгенерировать ssh ключ:

  • Генерируем ключи;

  • Заходим в Настроить jenkins > Manage credentials;

  • Выбираем где будет хранится токен. У нас только 1 вариант. System > Global credentials (unrestricted)

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
  • Нажимаем Add credentials и выбираем ssh username with ptivate key. Вводим ключ  id и описание. В id лучше вводить что то осмысленное;

  • Добавляем публичный ключ в репозиторий.

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

  • sonarProject = код проекта в sonarqube;

  • sonarProjectName = название проекта в sonarqube;

  • gitCommitHash - короткий хэш коммита для использования в качестве версии докер образа;

  • GIT_REPO_BRANCH и GIT_REPO_URL определяются в параметрах запуска.

  • credentialsId: 'jenkins-jenkins' наш ssh ключ созданный выше.

stages {

stage('Get sources') {  //название этапа пайплайна

steps {

cleanWs() // очистка каталога сборки

checkout([$class: 'GitSCM', branches: [[name: params.GIT_REPO_BRANCH]], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkins-jenkins', url: params.GIT_REPO_URL]]])  // клонирование репозитория


script {

// получение информации из git для дальнейшего использования при сборке и в sonarqube

gitRepoPath = params.GIT_REPO_URL.substring(params.GIT_REPO_URL.lastIndexOf(":") + 1)

sonarProject = gitRepoPath.minus(".git").minus("-").minus("_").minus("/")

sonarProjectName = gitRepoPath.minus(".git")

gitCommitHash = sh (script: "git log -n 1 --pretty=format:'%h'", returnStdout: true)

currentBuild.displayName = sonarProjectName + " " + params.GIT_REPO_BRANCH

currentBuild.description = sonarProjectName + " " + params.GIT_REPO_BRANCH + " " + gitCommitHash

}

}

}

Запуск тестов.


На данном этапе запускаются юнит тесты.

  • when  выполнение только при определенном значении переменной которая задается в параметрах запуска;

  • beforeAgent true проверка условия запуска перед загрузкой образа агента;

  • image params.BUILDER_IMAGE - контейнер в котором будут запускатся тесты, задается в параметрах;

  • agent запуск этапа в докер контейнере;

  • args  '-v /home/jenkins/.cache:/home/jenkins/.cache ' монтируется каталог с библиотеками go, для того чтобы не скачивать их при повторном запуске;

  • reuseNode true - запуск на той же ноде, на которой запускались предыдущие шаги.

stage ('Run tests') {

when { 

environment name: 'RUN_TESTS',

value: 'true'

beforeAgent true

}

agent { 

docker {

image params.BUILDER_IMAGE

args  '-v /home/jenkins/.cache:/home/jenkins/.cache '

registryCredentialsId 'docker-registry'

registryUrl "https://harbor.iops-test.com"

reuseNode true

}

}

steps {

sh """

make test

"""

}

}


Тесты на данном этапе запускаются в докер контейнере. Делается это для того чтобы не держать различные инструменты сборки всевозможных версий на одной ноде. В качестве registry используется harbor.


Статический анализ кода.

На данном этапе будет производится статический анализ кода, а также его соответствие параметрам которые мы определим в sonarqube.

После сканирования кода обработка результатов на стороне сервера sonarqube занимает некоторое время. Обработка может длится довольно долго при большом объеме кода. Так же webhook от сервера sonarqube с результатами  может провалится. Поэтому нужно всегда выставить таймаут.

Настройка SonarQube quality gate

  • Заходим в SonarQube;

  • В верхней панели навигации переходим на вкладку quality gate;

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
  • Нажимаем Create;

  • Вводим название нашего qg и нажимаем save;

  • В открывшемся окне нажимаем add condition и вводим интересующие нас критерии. При несоответствии этим критериям qg будет считаться не пройденным и наш пайплайн завершится с ошибкой.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
  • Нажимаем кнопку set as default. Теперь все проекты будут по умолчанию привязаны к этому qg

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Настройка SonarQube webhook

Для того чтобы jenkins мог получать результаты проверки quality gate нужно настроить webhook.

На стороне jenkins:

  • Добавляем токен в credentials c типом secret text, как это было описано выше. токен вводим произвольный;

  • Заходим в Настроить jenkins > Конфигурация системы;

  • В разделе SonarQube servers наш токен в Webhook Secret;

  • Остальные параметры также должны быть заполнены. Server authentication token - берется из настроек пользователя SonarQube;

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

На стороне SonarQube:

  • Заходим в administration > configurations > webhooks

  • Нажимаем Create;

  • Вводим название, адрес jenkins, токен который мы указывали как Webhook Secret выше. адрес в формате  <jenkins>/sonarqube-webhook/

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

stage ('Run sonar checks') {

when {

environment name: 'SONAR_CHECKS',

value: 'true'

beforeAgent true

}

agent {

docker {

image 'sonarsource/sonar-scanner-cli'

args  '--rm  '

reuseNode true

}

}

steps{

script{

withSonarQubeEnv('sonar-server') {


sh """

curl -u ${SONAR_AUTH_TOKEN}:  ${SONAR_HOST_URL}/api/projects/create -d 'project=${sonarProject}&name=${sonarProjectName}' # Создаем проект, если его еще нет

/opt/sonar-scanner/bin/sonar-scanner \ # запуск сканера

-Dsonar.projectKey=${sonarProject} \

-Dsonar.sources=./

"""

}

timeout(time: 5, unit: 'MINUTES') { // таймаут на ожидание результатов

def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv

if (qg.status != 'OK') { // завершение пайплайна при непрохождении qualitygate

error "Pipeline aborted due to quality gate failure: ${qg.status}"

}

}

}

}

}

Сборка кода.


На данном этапе собираем наше приложение. Здесь все аналогично этапу запуски тестов.


stage ('build service') {

when {

environment name: 'BUILD_SERVICE',

value: 'true'

beforeAgent true

}

agent {

docker {

image params.BUILDER_IMAGE

args  '-v /home/jenkins/.cache:/home/jenkins/.cache '

registryCredentialsId 'docker-registry'

registryUrl "https://harbor.iops-test.com"

reuseNode true

}

}

steps {

sh """

make build

"""

}

}

Сборка докер образа.

Это последний этап сборки docker образа и его деплоя в harbor.

В качестве сборщика можно использовать образы из dockrhub или любых других внешних registry. Для этого в harbor нужно предварительно создать проект который проксирует запросы во внешние registry.

stage ('build docker image') {

when {

environment name: 'BUILD_IMAGE',

value: 'true'

beforeAgent true

}

steps {

script {

docker.withRegistry('https://harbor.iops-test.com/', 'docker-registry') {

sh """#!/bin/bash

docker build -t harbor.iops-test.com/internal/sgapp:${gitCommitHash} .

docker push harbor.iops-test.com/internal/sgapp:${gitCommitHash}

docker rmi harbor.iops-test.com/internal/sgapp:${gitCommitHash}

"""

}

} 

}

}

Как результат мы имеем собранный образ в нашем registry. Там же его можно проверить на уязвимости.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Для примера взят другой образ.

Создание пайплайна

  • Создаем item c типом pipeline.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
  • добавляем наш jenkinsfile c пайплайном который лежит в git.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

сохраняем.

Запуск пайплайна


Запускаем пайплайн. Первый раз он провалится. т.к. при первом запуске наш джоб не знает ничего о параметрах запуска.

При втором запуске появляются параметры выполнения. Заполняем их.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост
Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Видно что все кроме сборки образа завершились  успешно. Это произошло потому что dockerfile учитывает сборку находящуюся в его репозитории. Она при выполнении копирует бинарники по другим путям. Конечно если вы пишете автоматизацию сборки сами у вас все это должно совпадать. Для того чтобы это обойти можно написать дополнительные этапы пайплайна для получения dockerfile из отдельного репозитория.


слева на экране мы видимо историю сборок.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

щелкнув по значку SonarQube  перейдем в проект  и увидим результаты проверки.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Но все таки давайте проверим что наш пайплайн работает полностью. Для этого напишем простое приложение и попробуем его собрать. Так же, вероятно вам не захочется каждый раз запускать руками сборку. Добавим автосборку по пушу. Для этого будем использовать generic webhook plugin.

Для создания вебхука который будет запускать наш пайплайн зайдем в настройки репозитория с нашим приложением - https://github.com/kilin-s/sgapp/.

  • Заходим в настройки settings > webhook > add webhook;

  • Добавляем ссылку на jenkins в формате <jenkins>/generic-webhook-trigger/invoke?token=abc123

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Кроме доступа к jenkins По токену будет определятся пайплайн для запуска.

В нашем пайплайне добавляем следующие строки

triggers {

GenericTrigger(

genericVariables: [

[key: 'GIT_REPO_URL', value: '$.repository.ssh_url'],

[key: 'GIT_REPO_BRANCH', value: '$.ref']

],

causeString: 'Triggered on $ref',

tokenCredentialId: 'go-build-common-hook',

printContributedVariables: true,

printPostContent: false,

silentResponse: false,

shouldNotFlattern: false

)

}

  • tokenCredentialId - токен используемый дя запуска, берется из credentials;

  • genericVariables - запись значений полей из json запроса в параметры запуска.

Для того чтобы webhook начал работать пайплайн нужно запустить еще раз.

Сделаем еще 1 коммит в наш репозиторий для проверки запуска и сборки.

Очередной пайплайн сборки для вашего приложения Гайд, Технологии, DevOps, Jenkins, Github, IT, Длиннопост

Пайплайн завершился успешно.

Заключение.

Данный пайплайн можно использовать как отправную точку для построения своего ci.

Добавлять любые шаги и проверки. С доработкой использовать его как проверку пул реквестов или просто сборки своих приложений.

ссылки:

sonarqube jenkins extension

репозиторий собираемого приложения

репозиторий с пайплайном

jenkins pipeline syntax

node exporter

harbor

Показать полностью 18
[моё] Гайд Технологии DevOps Jenkins Github IT Длиннопост
11
322
bratgrim
3 года назад

Фальшивый itшник⁠⁠

Я обычный казахский парень и как обычный казахский парень, я работаю devopsом. Ну у нас в степи обычно как бывает, когда человеку даже овец пасти не доверяют, а таксовать машины нет, приходится работать в it. Долгое время я прятался от степных волков и казашек которым пора замуж, на проекте в налоговой, притворно изображая администратора. Со временем я научился делать это так умело, что даже матёрые админы замечать перестали. Этот театр одного актера продолжался долгие 15 лет. Но однажды принудительно возвращенный в офис с удаленки, с удивлением обнаружил что половина отдела приходят со своими рабочими проблемами и мне приходится их решать. Посидев в роли наставника пару дней, понял, пора валить. Начал искать работу, где я смогу притворяться за ту же сумму но не так много. Однажды на одном из собеседований, когда я рассказывал какие мохинаций с bash я применял, что бы ничего не делать, hr мне поставил диагноз "так ты этот... как его.., DevOps". Ого! подумал я "такими мы ещё не притворялись" и смело указал в резюме что DevOps. И с тех пор уже три года я успешно притворяюсь DevOps ом в разных фирмах. Это совсем просто прохожу одно собеседование за другим и когда появлялись вопросы на которые я не мог ответить, я просто иду читать ответы. А устроившись просто делал то что читал. И вот сегодня я вышел на новую работу в очередной раз я обманул devops senior-а рассказав как расцветёт его система с применением практик инфраструктурного кода. Он даже принял за чистую монету что ci на jenkins я использую, не потому что не знаю как это делается в gitlab, а потому что убежден что нельзя класть яйца репозитория и пайплайна в один сервис. Спустя какое то время, когда я выслушивал ответную его тираду "что микросервисы надо использовать только в том случае когда не можешь спрогнозировать нагрузку на систему". И тут меня осенило я имею дело с гениальным актером который научился притворяться на уровне senior DevOps. Придурка который открыл статью "какие вопросы надо задавать девопсу на собеседовании" я бы распознал сразу.
И вот первый рабочий день, начали мы как у них в обычаях со стендапа. Потому как он прошел закрались первые смутные сомнения. Senior в задачи погрузится не дал. На вопрос под какие ОС писать плейбуки? мне не внятно промычал и что то куда-то принялся писать. Какой вид бэкапа писать в плейбуке для mysql? сказали покамест не нужно писать его вообще. Из чего я понял что тех задание на испытательный месяц писали для меня на шару.
Senior поругал отвлеченого на посторонние разговоры в офисе девопса. Мол у нас дескать стендап, а ты отвлечен фу фу фу. Как бы показывая зубки альфача. А когда бета девопс начал что то тоже конкретизировать из серий "будет ли в плейбуке докер" последовал ответ он сам должен это спрашивать. А когда я повторил вопрос он не ответил. Ну думаю хрен с тобой senior помидор, самое место такому на rotten tomato's"
Где то два или три часа меня донимал бухгалтер требуя подписать все на свете.
Затем hr-ом я был запущен в корпоративный Битрикс где должен был ознакомиться с видео материалами. В сумбурные речи лекторов я вслушиваться не стал, в нашей профессии быстро учишься определять инфоциган торгующих рожей на фоне скрина какого-нибудь софта. Да мудрено ли с моим стажем в почти двадцать лет верить в сказки из серий "построение горизонтальных связей между работниками ускорит процесс согласования" ага щаз, вы мне ещё про "собор и базар" расскажите. Полтора часа ребята с видео, переливали из пустого в порожнюю, тыкая пальцем в схему о которой любая секретутка выразилась бы "ой бывала я в структурах и по больше". После увиденного смутные сомнения начали терзать с новой силой".
Окончательно точка поставлена была только во время прохождения материалов по логировнию, так они "протоколирование выполненных работ" у себя на иностранный манер обозвали. Снова и снова читая пяти страничный текст, я просто диву давался, как можно было простую мысль "записывайте за собой все что делаете" тонким слоем смысла натянуть на пять страниц с рисунками. Я всякое видел но такое, такое ощущение что у автора стояла задача зашифровать а не обьяснить. И когда я увидел тест в конце текста, все наконец-то встало на свой места.
Раз за разом проваливая тест на двух вопросах из шести, я разбирал ситуацию "Так значит ребята вы наняли инженера, час которого стоит как рандеву с путаной. И вместо того что бы дать доступ к aws, вы его талмудом от аутистов об тесты херачите? Сразу повеяло душком каворкинга родной нацкомпаний, в ней начальство так усердно делало вид что работает, что местами даже само в это верило. И вот эта вера и рождала в чреслах менеджмента, такие вот документы и тесты. Ну там то гос бюджет все понятно. А тут что происходит? А тут тоже самое, разница только в том весь этот театр для инвесторов. Через годик до инвестора дойдет что "царь не настоящий". А прибыль не женский оргазм, такое не сыграть. Если даже и получится, то на суде и бездарно как у Эмбер Херд. И пойду я с вами на hh собеседование клянчить. Подумал я и написал hr-у который как ни странно был самым настоящим "бро сори, но я сваливаю"
Потому что я притворяюсь почти 20 лет, уж я то в курсе как ложь огорчает, не умелая ложь бесит. А самообман это глупость вызывающая недоумение.

Показать полностью
[моё] IT DevOps Системное администрирование Админ Разработчики Компания Работа Отдел кадров HH Казахстан Казахи Ложь Gitlab Jenkins Текст
45
228
akatosh199512
akatosh199512
3 года назад
Аниме

Ходячий замок⁠⁠

Ходячий замок
Anime Art Аниме Sophie Hatter Jenkins Ходячий замок Хаула
9
59
DELETED
3 года назад
IT-юмор

Один день из жизни IT-компании⁠⁠

Или история о том, как команда разработчиков заливала приложение на продакшн

Бонус в комментариях

IT юмор IT Продакшн Айтишники Разработка Программирование Agile Jenkins Компания Видео
5
75
tproger.official
tproger.official
3 года назад
Типичный программист

Сектор «Деплой» на барабане!⁠⁠

Сектор «Деплой» на барабане!
Поле Чудес Якубович World of Warcraft Jenkins
29
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии