Я не буду останавливаться на роли платформы CI/CD. Docker-контейнеризация сейчас более популярна (быстрое бесшовное переключение среды и т. д.), поэтому в мире нет набора сформированных и фиксированных пакетов, помогающих предприятиям быстро создавать собственные CI/CD-платформы (кроме тех, кто платит за услуги). , Облако Docker тоже разнообразнее, DaoCloud, Swarm и так далее. Автору посчастливилось участвовать в построении платформы CI/CD компании и построить с нуля платформу непрерывной интеграции и непрерывной доставки, которая почти близка к завершению. Поделитесь здесь, для чтения этого сообщения в блоге требуются следующие запасы знаний и требования:
- Jenkins
- docker, облако докеров (Rancher или другое облако)
- Начинал как платформа CI
Структура статьи
- Традиционная платформа CI на основе сценария Jenkins, Shell
- Контейнерная платформа CI/CD на основе Jenkins и облака докеров
1. Традиционная платформа CI на основе Jenkins, сценарий Shell
Создавать CI-платформу на основе скрипта Shell автор начал еще в предыдущей компании, здесь не буду многословен, просто приведу картинку:
2. Контейнерная платформа CI/CD на основе Jenkins и облака докеров
Вот и наступило главное событие. Развертывание на основе сценариев оболочки может фактически удовлетворить требования CI обычных предприятий, однако для быстрого развертывания мультиинженерных и независимых от платформы микросервисных архитектур требуется контейнерное развертывание. Аналогично предыдущей картинке:
Вот пошаговое объяснение:
1. Отправка кода
2. Запустить сборку Jenkins на основе вебхука
Грубо говоря, в коде упоминается Gitlab.Настройте веб-хук в Gitlab для отправки запроса, подобного Jenkins, и Jenkins начнет выполнять сборку после получения запроса. Конечно, Jenkins полагается на плагин Gitlab для поддержки этой функции. Справочная запись в блоге:Использование плагина Gitlab
3. Сделайте сборку
Этот шаг самый утомительный, и о нем важно рассказать, так как здесь задействовано множество конфигураций. Первое, что я должен сказать, это то, что мой Дженкинс здесь физически развернут. Я опубликую конфигурацию Jenkins на этом шаге в конце. На этом этапе Jenkins выполняет сборку (чистую установку) и автоматически упаковывает проект в соответствии с подключаемым модулем.
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
Положитесь на предварительно подготовленный Dockerfile, чтобы создать образ Docker и отправить его в удаленную гавань. На этом этапе вам необходимо обратить внимание на следующую конфигурацию:
- Конфигурация докерной среды.
- конфигурация плагина docker-maven Ни одна из конфигураций не настроена так хорошо.
- Давайте поговорим о первом. После установки среды Docker вам нужно настроить реестры Docker Insecure, чтобы добавить собственный адрес Harbour частного сервера. Это связано с тем, что Docker использует протокол https при отправке изображений, а Harbour — это протокол HTTP, поэтому вам нужно установить Доверять этому адресу, иначе при отправке будет сообщение об ошибке. Справочная запись в блоге:докер настроить адрес доверия, или дайте скриншот моей конфигурации:
- Второй, настройка этого плагина еще сложнее, поэтому начнем с моей собственной конфигурации.
<build>
<resources>
<resource> //必须要转换一下,因为Dockerfile里有内置变量需要转换
<directory>src/main/docker</directory>
<filtering>true</filtering>
<includes>
<include>**/Dockerfile</include>
</includes>
<targetPath>../docker</targetPath>
</resource>
<!--注意这里一定要把resources目录下的配置文件引进去,并且不要指定targetPath-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>docker-private-registry</serverId>
<registryUrl>${docker.repostory}</registryUrl>
<pushImage>true</pushImage>
<imageName>
${docker.repostory}/${docker.registry.name}/${project.artifactId}
</imageName>
<dockerDirectory>
${project.build.directory}/docker
</dockerDirectory>
<resources>
<rescource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</rescource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
Здесь следует указать, что строка docker-private-registry должна быть настроена с использованием вашего порта и пароля учетной записи в вашем файле настроек maven.
<server>
<id>docker-private-registry</id>
<username>zdy</username>
<password>****</password>
<configuration>
<email>something@qq.com</email>
</configuration>
</server>
Дайте справочный пост в блоге (рекомендуется использовать мою конфигурацию, справочный пост в блоге можно использовать только для справки, ошибок много):Spotify плагин
Затем дайте Dockerfile в свой собственный каталог srm/main/docker.
FROM anapsix/alpine-java:8
ENV APP_NAME @project.build.finalName@.@project.packaging@
# 后期更改为日志目录,将日志挂载出来
VOLUME /tmp
#默认工作目录/
ADD $APP_NAME /app.jar
EXPOSE 8070
ENTRYPOINT ["java","-jar","/app.jar"]
Про конкретную конфигурацию выше рассказывать не буду,потому что она очень сложная.Например,встроенные переменные в dockerfile не конвертируются.Можете сослаться на мою конфигурацию.Конфигурация давно разобрана.Как старая поговорка гласит, мы говорим только об идеях.Для конкретной конфигурации, пожалуйста, обратитесь к другим статьям.Как только идеи появятся, вы можете найти их медленно.
4. После завершения сборки отправьте запрос CURL, чтобы активировать WebHook Rancher.
В соответствии с приведенной выше конфигурацией сборка jenkins завершена, и наш недавно созданный образ докера также отправляется в библиотеку образов удаленного частного сервера HarBor. В этот момент выполняется команда CURL, чтобы заставить Rancher извлечь развертывание образа. Ниже приведен скриншот моего jenkins.
Что касается того, как написать за CURL, веб-хук официального веб-сайта Rancher необходимо заранее настроить в веб-хуке Rancher, сгенерировать некоторые параметры, а затем закрутить.Rancher WebHook5. Rancher извлекает образ и развертывает его в соответствии с триггером WebHook.
Это неаккуратно, и многие могут быть обмануты.На самом деле суть этого поста в блоге - картинка в начале.В ней можно примерно разобраться, изучив идеи на картинке.Почему автор неохотно рассказывает об этом в Детали?Вещи слишком хлопотные, многие конфигурации очень сложны, и вам нужно исследовать их самостоятельно. Я могу только подумать.
Я не буду демонстрировать эффект.После отправки кода образ, созданный в Jenkins, автоматически отправляется в Harbor, а затем WebHook Curl Ranche запускает Rancher, чтобы получить последний образ и развернуть его.Over, Have a good day .