一、使用gitlab-ci
1.编写springboot应用。
目录结构如下
2.编写Dockerfile文件,我这里写得比较简单
FROM primetoninc/jdk:1.8
MAINTAINER axiba@qq.com
ADD target/ci-docker.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
3.编写.gitlab-ci.yml文件
variables:
CI_DOCKER_CONTAINER: "ci-docker"
CI_DOCKER_IMAGE: "ci-docker-image"
CI_DOCKER_NAME: "ci-docker"
CI_DOCKER_PORT: 8080
stages:
- test
- build
- deploy
- scanner
test:job:
stage: test
script:
- echo "test job start"
build:job:
image: maven:3.3.9-jdk-8
stage: build
script:
- echo "build job start"
- mvn clean package -Dmaven.test.skip=true
- echo "install success"
artifacts:
paths:
- target/ci-docker.jar
when: on_success
only:
- master
tags:
- ifun-docker
deploy:job:
image: docker:latest
stage: deploy
script:
- echo "deploy job start"
- docker ps -a|grep $CI_DOCKER_CONTAINER && docker stop $CI_DOCKER_CONTAINER && docker rm $CI_DOCKER_CONTAINER || echo "not exist"
- docker images |grep $CI_DOCKER_IMAGE && docker rmi -f $CI_DOCKER_IMAGE || echo "not exist"
- docker build -t $CI_DOCKER_IMAGE .
- docker run -d -p 80:$CI_DOCKER_PORT --name=$CI_DOCKER_NAME $CI_DOCKER_IMAGE
only:
- master
tags:
- ifun-docker
scanner:job:
stage: scanner
script:
- echo "代码扫描"
- mvn sonar:sonar -Dsonar.projectKey=ci-docker -Dsonar.host.url=http://192.168.80.10:9000 -Dsonar.login=3c4da7f061cae0c07b5f1a73f9e17b42cf0b6512
only:
- master
tags:
- ifun-docker
简单解释一下,分为了三个阶段,test、build、deploy、scanner
test中简单的打印了一下;build阶段使用maven打包,并将jar包上传到artifacts中;deploy阶段先删除容器,再删除镜像,然后创建镜像,运行容器。scanner阶段是代码扫描阶段,可以不用写。
4.docker 容器运行结果
5.测试请求是否成功。
6.代码扫描结果
二、问题汇总
1.mvn command not found
这是你的gitlab-runner所在的服务器中没有安装maven,需要安装。
2.no main manifest attribute, in app.jar,这是没有指定mainclass,需要在pom.xml中指定
<build>
<finalName>ci-docker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.it.fun.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
3.Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
这是权限不足,我们gitlab-runner运行的时候默认的是gitlab-runner用户,他是没有docker权限的。
# 添加docker用户组和docker用户,并将用户添加到组中
groupadd -r docker
useradd -g docker -r docker -p 'password here'
# 然后将gitlab-runner添加到docker组中
usermod -aG docker gitlab-runner
# 最后将docker服务停止,切换到docker用户再重新启动服务,gitlab-runner用户就和docker用户组一样有rw权限
service docker stop
su docker
sudo service docker start
4.如果一个job一直pending状态,没有runner来执行,解决方法有两种:
1> 绑定tags
2> 修改任意一个runner,让他可以运行没有绑定tags的任务。