CI/CD

Java Архитектура Эксплуатация и техническое обслуживание

Я не буду останавливаться на роли платформы CI/CD. Docker-контейнеризация сейчас более популярна (быстрое бесшовное переключение среды и т. д.), поэтому в мире нет набора сформированных и фиксированных пакетов, помогающих предприятиям быстро создавать собственные CI/CD-платформы (кроме тех, кто платит за услуги). , Облако Docker тоже разнообразнее, DaoCloud, Swarm и так далее. Автору посчастливилось участвовать в построении платформы CI/CD компании и построить с нуля платформу непрерывной интеграции и непрерывной доставки, которая почти близка к завершению. Поделитесь здесь, для чтения этого сообщения в блоге требуются следующие запасы знаний и требования:

  • Jenkins
  • docker, облако докеров (Rancher или другое облако)
  • Начинал как платформа CI

Структура статьи

  1. Традиционная платформа CI на основе сценария Jenkins, Shell
  2. Контейнерная платформа 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 и отправить его в удаленную гавань. На этом этапе вам необходимо обратить внимание на следующую конфигурацию:

  1. Конфигурация докерной среды.
  2. конфигурация плагина docker-maven Ни одна из конфигураций не настроена так хорошо.
  • Давайте поговорим о первом. После установки среды Docker вам нужно настроить реестры Docker Insecure, чтобы добавить собственный адрес Harbour частного сервера. Это связано с тем, что Docker использует протокол https при отправке изображений, а Harbour — это протокол HTTP, поэтому вам нужно установить Доверять этому адресу, иначе при отправке будет сообщение об ошибке. Справочная запись в блоге:докер настроить адрес доверия, или дайте скриншот моей конфигурации:
    docker配置信任地址
  • Второй, настройка этого плагина еще сложнее, поэтому начнем с моей собственной конфигурации.
<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.

Jenkins配置
Что касается того, как написать за CURL, веб-хук официального веб-сайта Rancher необходимо заранее настроить в веб-хуке Rancher, сгенерировать некоторые параметры, а затем закрутить.Rancher WebHook

5. Rancher извлекает образ и развертывает его в соответствии с триггером WebHook.

Это неаккуратно, и многие могут быть обмануты.На самом деле суть этого поста в блоге - картинка в начале.В ней можно примерно разобраться, изучив идеи на картинке.Почему автор неохотно рассказывает об этом в Детали?Вещи слишком хлопотные, многие конфигурации очень сложны, и вам нужно исследовать их самостоятельно. Я могу только подумать.

Я не буду демонстрировать эффект.После отправки кода образ, созданный в Jenkins, автоматически отправляется в Harbor, а затем WebHook Curl Ranche запускает Rancher, чтобы получить последний образ и развернуть его.Over, Have a good day .