构建docker镜像自动化部署
1、安装maven、安装docker
maven、docker网上安装教程很多,这里不演示
坑1:配置daemon
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["后面的harbor地址:端口"]
}
2、安装nexus私有库(推送自己的包到maven,如果不需要可以不安装)
2.1、neuxs安装教程不演示
2.2、maven配置
找到maven安装目录conf/settings.xml
项目中pom也要配置,注意id一致(如果你是微服务,这个服务有api、sdk、server,server作为启动端,那么你需要把打包文件挂到最外层,如下面第二张图配置)
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<servers>
<server>
<id>a-releases</id>
<username>admin</username>
<password>mima!</password>
</server>
<server>
<id>a-snapshots</id>
<username>admin</username>
<password>mima!</password>
</server>
<server>
<id>nexus-central</id>
<username>admin</username>
<password>mima!</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus-central</id>
<name>Nexus Central</name>
<url>http://ip:port/repository/maven-public/</url>
<mirrorOf>*,!getui-nexus</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>bbc</id>
<repositories>
<repository>
<id>central</id>
<name>Nexus</name>
<url>http://ip:port/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>a</activeProfile>
</activeProfiles>
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
<localRepository>/home/test/maven-registory</localRepository>
</settings>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>
../target/
</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>a-releases</id>
<name>release</name>
<url>http://ip:port/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>a-snapshots</id>
<name>snapshots</name>
<url>http://ip:port/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
3、安装gitlab+gitlab-runner(注册过程TAG和ci文件一致)
参照基于Docker GitLab 搭建 GitLab runner 搭建 GitLab CI/CD - 简书
坑2:基于ci配置,build阶段基于maven:3.3-jdk-8,image阶段镜像是docker in docker模式(需要runner开启一个配置,可以查看官网)结果:runner配置文件改 privileged = true
build阶段需要每次拉取maven打包,如果不想每次都打所有包,需要把gitlab-runner内部maven挂载到宿主机,如果想使用自己的settings.xml配置,则需要把maven环境映射宿主机,如下:
注意!!! 如果使用了settings,映射时请注意<localRepository>标签内容
1.进入gitlab-runner目录,gitlab-runner/config/conf.toml
2.修改使用的runners,volums映射宿主机maven,仓库和配置
volumes = ["/cache", "/home/test/maven-registory:/home/test/maven-repository:rw", "/home/test/testauto/apache-maven-3.3.9/conf/settings.xml:/usr/share/maven/conf/settings.xml"]
docker in docker模式缺点,宿主机的maven仓库需要提前放好包,不然后续还会拉取远程;
!经过改进,build阶段使用shell模式,image阶段使用docker模式,详情见最后第6步
4、安装harbor
wget -P /home/horbor https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz cd /home/harbor tar -zxvf ./harbor-offline-installer-v2.1.0.tgz cp ./harbor.yml.tmpl ./harbor.yml vim ./harbor.yml #配置http或者https,建议https 因为上线要用;配置密码 ./prepare ./install.sh #密码在common/config/db/env
5、安装rancher
网上很多文章,没有什么坑,这里不演示
6、gitlab-ci.yml与dockerFile配置(网上教程都是pom.xml配置,ci和docker能引用,我这里不行,所以使用脚本读取配置)
${}是在gitlab变量里面配置的
第一种:build与image阶段都是gitlab-runner,docker模式
# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
- compile
- build
- run
# 定义全局变量
variables:
IMAGE: "bbc-captcha"
PROJECT_VERSION: "1.0"
# 这里定义了Maven的jar包存放地址,与我们构建maven私服的时候设置的存放地址一致
MAVEN_REPO: "/.m2"
# 这里定义了打包成功后的Docker镜像名称,每一次提交代码后构建成功的镜像名称都是唯一的
IMAGE_FULL_NAME: ${ALIYUN_URL}/${ALIYUN_NAMESPACE}/${ALIYUN_REGISTRY}:${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHA}
DOCKER_TLS_CERTDIR: ''
build:
# 当前阶段的执行镜像,这是我们自己构建的镜像
image: maven:3.3-jdk-8
# 属于上面定义的哪一个阶段
stage: compile
# 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段
allow_failure: false
# 运行脚本
script:
- export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
- echo "PROJECT_VERSION name is $PROJECT_VERSION"
- echo "开始maven clean package $PROJECT_VERSION"
- mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
- echo "$PROJECT_VERSION" >> $PROJECT_VERSION.version
# 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间
artifacts:
name: $IMAGE
expire_in: 7 days
paths:
- target/*.jar
- ./*.version
# 设置在dev的runner上面执行
tags:
- java
build image:
image: docker:18.09.7
services:
- docker:18.09.7-dind
stage: build
script:
# 这里的变量会自动获取你当前推送代码的gitlab用户和密码以及仓库地址
- FILENAME=$(ls target/*.jar | head -n 1)
- PROJECT=${FILENAME%.jar}
# 这些属性在gitlab配置
- docker login --username=${USER_NAME} ${ADDR_IP} --password ${PASS_WORD}
- PROJECT_VERSION=$(ls *.version | head -n 1)
- PROJECT_VERSION=${PROJECT_VERSION%.version}
- echo "PROJECT_VERSION = $PROJECT_VERSION"
- echo "登录harbor成功"
- echo "Project name is $PROJECT"
# 这里的变量就是我们全局配置定义的了
- docker build --build-arg JAR_FILE=/$FILENAME -t $IMAGE .
- echo "IMAGE is ------ $IMAGE"
- docker tag $IMAGE:latest ${ADDR_IP}/bbc/$IMAGE:$PROJECT_VERSION
- docker push ${ADDR_IP}/bbc/$IMAGE:$PROJECT_VERSION
- echo "上传jar镜像包到harbor成功,开始删除target 和镜像"
- rm -rf target
- docker rmi $IMAGE:latest
# 设置在dev的runner上面执行
tags:
- java
Dockerfile文件内容如下: FROM primetoninc/jdk:1.8 WORKDIR /bbc ARG JAR_FILE COPY ${JAR_FILE} ./app.jar EXPOSE 9999 # -c为清除以前启动的数据 ENTRYPOINT java -jar *.jar
第二种(推荐):gitlab-runner一阶段shell,二阶段docker,这样一阶段使用maven使用了宿主机环境,本地不需要手动放包,会自动拉取映射,后续也不会一直拉取远程
build: # 属于上面定义的哪一个阶段 stage: compile # 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段 allow_failure: false # 运行脚本 script: - export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) - echo "PROJECT_VERSION name is $PROJECT_VERSION" - echo "开始maven clean package" - mvn clean package -Dmaven.test.skip=true - echo "$PROJECT_VERSION" >> $PROJECT_VERSION.version # 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间 artifacts: name: $IMAGE expire_in: 1 days paths: - target/*.jar - ./*.version
必须:需要在linux配置环境 vim /etc/profile,里面配置改为自己的路径
JAVA_HOME=/opt/jdk1.8.0_371
PATH=/opt/jdk1.8.0_371/bin:$PATH
export JAVA_HOME PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export MAVEN_HOME=/home/test/testauto/apache-maven-3.3.9
export PATH=${PATH}:${MAVEN_HOME}/bin
source /etc/profile 生效
必须:重新配置gitlab-runner,将环境挂载到gitlab-runner中
which java与which mvn可以查看路径,取/bin前面的部分,如下-v配置启动
docker run -d --name gitlab-runner --restart always \
-v /docker/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/test/testauto/apache-maven-3.3.9:/home/test/testauto/apache-maven-3.3.9 \
-v /opt/jdk1.8.0_371:/opt/jdk1.8.0_371 \
gitlab/gitlab-runner:latest
必须:docker exec -it gitlab-runner bash 进入gitlab-runner配置环境
docker exec -it gitlab-runner bash
#以下都是再容器内,没有退出
#安装vim
apt-get install vim
vim /etc/profile
加入如下3行配置
########
JAVA_HOME=/opt/jdk1.8.0_371
MAVEN_HOME=/home/test/testauto/apache-maven-3.3.9
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH#########
#生效
source /etc/profile
#检测
mvn -v
java -version
显示版本则成功
!!!必须:使用第二种,务必把maven settings.xml中的<localRepository>标签去掉
到此就搭建好了,然后就可以推送到gitlab,去harbor检查镜像,rancher使用镜像(rancher可以使用端口映射,不过进入docker ps没有显示出来,不用担心直接使用)
###########如果你严格按照我的步骤,理论不会有问题,如果有问题,欢迎留言#########