GitLab-CI介绍 官方介绍
.gitlab-ci.yml语法介绍 官方.gitlab-ci.yml说明
创建SpringBoot项目 使用Google的Jib插件构建docker镜像 官方文档
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 62 63 64 65 66 import org.jetbrains.kotlin.gradle.tasks.KotlinCompileplugins { id("com.google.cloud.tools.jib" ) version "3.3.1" id("org.springframework.boot" ) version "2.6.8" id("io.spring.dependency-management" ) version "1.0.11.RELEASE" kotlin("jvm" ) version "1.6.21" kotlin("plugin.spring" ) version "1.6.21" java } apply<JavaPlugin>() apply<JavaLibraryPlugin>() group = "com.wry" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_1_8 repositories { maven("https://maven.aliyun.com/repository/public/" ) mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-web" ) implementation("com.fasterxml.jackson.module:jackson-module-kotlin" ) implementation("org.jetbrains.kotlin:kotlin-reflect" ) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8" ) testImplementation("org.springframework.boot:spring-boot-starter-test" ) } configure<com.google.cloud.tools.jib.gradle.JibExtension>{ setAllowInsecureRegistries(true ) from { image = "openjdk:8" } to { image = "wry/${project.name} " tags = mutableSetOf("latest" ) } container { appRoot = "/app" workingDirectory = "/app" jvmFlags = mutableListOf( "-Dspring.backgroundpreinitializer.ignore=true" , "-Duser.timezone=Asia/Shanghai" , "-Dproject.name=${project.name} " ) ports = mutableListOf("8080" ) } } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict" ) jvmTarget = "1.8" } } tasks.withType<Test> { useJUnitPlatform() }
编写.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 default: image: openjdk:8 stages: - build - deploy build: stage: build image: openjdk:8 script: - chmod +x gradlew - CURRENT_PATH=$PWD - echo "当前路径:$CURRENT_PATH" - ./gradlew jibDockerBuild deploy: stage: deploy script: - echo "部署项目" - docker stop test-spring-boot - docker rm test-spring-boot - docker run -itd --restart=always -p 8081 :8080 --name test-spring-boot wry/test-spring-boot
使用常见的Docker-runner
执行器运行CI 执行CI过程中出现错误
错误原因 GitLab-CI
执行器是docker
,跑任务的时候会启动一个docker
容器, 容器内部没有docker
环境,所以找不到docker 守护进程**
解决办法 翻阅GitLab官方文档,看到GitLab-runner有一个Docker-In-Docker模式,可以在容器中使用docker环境官方链接
注册Docker-In-Docker模式的GitLab-runner 查看docker版本信息 查看宿主机docker
版本信息
注册GitLab-Runner 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 docker-compose exec <compose-service-name> gitlab-runner register -n \ --url "<url>" \ --registration-token "<token>" \ --executor docker \ --description "Docker In Docker Runner" \ --docker-image "docker:20.10.22" \ --docker-privileged \ --tag-list "docker-in-docker"
查看结果 http://IP:PORT/admin/runners
修改.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 default: image: docker:20.10.22 tags: - docker-in-docker variables: DOCKER_HOST: tcp://120.76.142.218:2375 services: - docker:20.10.22-dind stages: - build - deploy build: stage: build script: - chmod +x gradlew - CURRENT_PATH=$PWD - echo "当前路径:$CURRENT_PATH" - docker version - ./gradlew jibDockerBuild deploy: stage: deploy script: - echo "部署项目" - docker stop test-spring-boot - docker rm test-spring-boot - docker run -itd --restart=always -p 8081 :8080 --name test-spring-boot wry/test-spring-boot
docker环境无java环境错误 注册新的GitLab-runner
后,发现在docker
环境下无法使用gradlew
进行docker镜像构建, 缺少JAVA
环境
解决办法 把java环境和docker环境分开 (模式一)
在java环境下把项目构建成docker镜像压缩包
在docker环境下还原docker镜像压缩包
先安装JAVA环境再安装docker环境(模式二)
在java环境下安装docker使其连接宿主机docker环境
https://stackoverflow.com/questions/71109409/gitlab-ci-docker-inside-java-image
修改.gitlab-ci.yml
文件 docker-in-docker
模式.gitlab-ci.yml
官方推荐写法
模式一 把java环境和docker环境分开
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 default: image: docker:20.10.22 tags: - docker-in-docker variables: DOCKER_HOST: tcp://120.76.142.218:2375 services: - docker:20.10.22-dind stages: - build - docker-image - deploy cache: paths: - build - .gradle/wrapper - .gradle/caches echo: stage: .pre script: - docker info build: stage: build image: openjdk:8 script: - chmod +x gradlew - CURRENT_PATH=$PWD - echo "当前路径:$CURRENT_PATH" - ./gradlew jibBuildTar docker-image: stage: docker-image script: - CURRENT_PATH=$PWD - echo "当前路径:$CURRENT_PATH" - docker load --input build/jib-image.tar deploy: stage: deploy script: - echo "部署项目" - docker stop test-spring-boot - docker rm test-spring-boot - docker run -itd --restart=always -p 8081 :8080 --name test-spring-boot wry/test-spring-boot
模式二 先安装JAVA环境再安装docker环境
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 default: image: docker:20.10.22 tags: - docker-in-docker variables: DOCKER_HOST: tcp://120.76.142.218:2375 services: - docker:20.10.22-dind stages: - build - deploy echo: stage: .pre script: - docker info build: stage: build image: gradle:jdk8 services: - docker:20.10.22-dind variables: DOCKER_HOST: tcp://120.76.142.218:2375 before_script: - apt update && apt install --no-install-recommends -y docker.io script: - chmod +x gradlew - CURRENT_PATH=$PWD - echo "当前路径:$CURRENT_PATH" - docker version - ./gradlew jibDockerBuild deploy: stage: deploy script: - echo "部署项目" - docker stop test-spring-boot - docker rm test-spring-boot - docker run -itd --restart=always -p 8081 :8080 --name test-spring-boot wry/test-spring-boot
运行CI
查看运行的docker容器
测试