Thank you for reading this post, don't forget to subscribe!
Есть проект который при сборке использует maven и выкачивает зависимости. Костыльный метод для запихивания зависимостей в контейнер сборки:
Имеется Dockerfile который собирает наш проект:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
FROM dockette/mvn as builder COPY paysoftclient-master/ /paysoftclient/ RUN mkdir /root/.m2/ COPY cache-maven/repository /root/.m2/repository RUN cd /paysoftclient/ && mvn installRUN cd / COPY terminalservices-master/ . RUN mvn package FROM openjdk:8-jre-alpine COPY app/application.properties /app/ COPY --from=builder /data/monolith-app/target/monolith-*.jar /app/ WORKDIR /app CMD ["java", "-jar", "/app/monolith-app-1.0-SNAPSHOT.jar"] |
Это мультистейдж сборка, на выходе получаем легковесный контейнер, поэтому все скачанный на первом этапе зависимости не вытащить.
cache-maven/ - это директория в корне проекта, в неё надо будет подкидывать зависимости
Далее у нас есть второй докерфайл с помощью которого будет проходить первый этап сборки только для того чтобы выкачать все зависимости
cat dockerfile2
1 2 3 4 5 6 7 |
FROM dockette/mvn as builder COPY paysoftclient-master/ /paysoftclient/ RUN cd /paysoftclient/ && mvn install RUN cd / COPY terminalservices-master/ . RUN mvn package |
А дальше начинается костыление в ci/cd
cat .gitlab-ci.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
stages: - create_image - run_redis - deploy_service variables: project_name: 'service' #Имя проекта name_space: 'terminal-soft' directory_for_maven_cache: '/home/gitlab-runner/cache-maven' # директория для хранения зависимостей maven name_temp_container: 'testcontainerforcachemaven' # имя временного контейнера .autorizate_to_gitlab: &autorizate_to_gitlab | #Данная запись является ЯКОРЕМ docker logout docker logout $CI_REGISTRY docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # тут мы авторизуемся в гитлаб на нашем ранере под пользователем с которым аутентифицировались в гитлабе .git_tag_variable: &git_tag_variable | git fetch --tags export TAG=$(git describe --tags --abbrev=0) echo $TAG create_image: # Первая стадия сборки образов stage: create_image tags: - runer-gitnexus-shell # Указываем какой ранер будет производить все действия. only: - master # Указываем что действия производятся на ветке мастер before_script: - *autorizate_to_gitlab # Вызов якоря для авторизации в гитлабе - *git_tag_variable - | if [ -d $directory_for_maven_cache ] # проверяем создана ли директория для хранения зависимостей, если нет то создаём её then echo "ok" else mkdir -p $directory_for_maven_cache fi if [ -z "$(ls $directory_for_maven_cache)" ] # проверяем пустая ли директория, и если нет то копируем все файлы в наш проект then echo "Empty" else cp -r $directory_for_maven_cache/* service/cache-maven/ echo "ls -l service/cache-maven/" ls -l service/cache-maven/ fi script: - > if [ -z "$(ls service/cache-maven/)" ] # если директория пустая, то запускаем сборку из dockerfile2 then echo "Empty" docker build -f service/dockerfile2 -t $name_temp_container service/. docker create --name $name_temp_container $name_temp_container # тут мы создаём временный контейнер docker cp $name_temp_container:/root/.m2/repository/ service/cache-maven/ # тут мы копируем зависимости из временного контейнера в наш проект, чтобы при сборке основной Dockerfile подтянул их cp -r service/cache-maven/* /home/gitlab-runner/cache-maven/ # тут мы копируем зависимости в директорию вне проекта, так как при перезапуске деплоя service/cache-maven/ будет очищена (так как в проекте нету зависимостей в этой директории) fi - docker build -f service/Dockerfile -t $CI_REGISTRY/$gitlab_user_project/$project_name:$TAG service/. # пути до файлов указываются относительно корня проекта - docker push $CI_REGISTRY/$gitlab_user_project/$project_name:$TAG # тут грузим всё в наш registry after_script: - *git_tag_variable - docker logout $CI_REGISTRY # Разлогиниваемся на гитлаб ранере - docker rm -f $name_temp_container # чистим за собой удаляя временный контейнер - docker rmi $name_temp_container # чистим за собой удаляя временный образ - docker rmi $CI_REGISTRY/$gitlab_user_project/$project_name:$TAG # Удаляем собранный образ с гитлаб ранера(чистим за собой) when: manual # Данные действия производятся вручную |
Остальную часть не вношу так как она в данном описании без надобности.
======================================================================
Другой вариант подтягивания кэша это использование плагина который на основе pom.xml выкачивает все зависимости.
Dockerfile выглядит следующим образом:
1 2 3 4 5 6 7 8 |
FROM dockette/mvn as builder COPY paysoftclient-master/pom.xml /data/pom.xml RUN mvn de.qaware.maven:go-offline-maven-plugin:resolve-dependencies -DdownloadSources -DdownloadJavadoc COPY paysoftclient-master/ /paysoftclient/ RUN cd /paysoftclient/ && mvn install RUN cd / COPY terminalservices-master/ . RUN mvn package |
Запускаем билд как обычно
Зависимости выкачаются первыми и если далее pom.xml изменять не будут то эти же слои контейнера вместе с зависимости будут использоваться в последующих пересборках.