第一部:准备2台虚拟机
服务器名 | IP |
---|---|
jenkins | 192.168.124.249 |
docker | 192.168.124.248 |
第二部:在jenkins服务器上安装java,因为后续需要编译代码,所以直接安装jdk
-
安装jdk,目前Jenkins最低需要jdk11
apt install openjdk-11-jdk
第三步:安装jenkins
-
由于Jenkins和Ubuntu版本更新,安装方式也可能会变.参考官方文档
https://www.jenkins.io/doc/book/installing/linux/#debianubuntu -
修改jenkins端口号
vim /etc/init.d/jenkins vim /etc/default/jenkins vim /usr/lib/systemd/system/jenkins.service systemctl daemon-reload
-
启用 Jenkins(自动启动),并使用以下命令验证状态:
systemctl enable jenkins systemctl start jenkins systemctl status jenkins
-
配置防火墙
我把jenkin的端口号设置为了7777ufw allow 7777 ufw allow OpenSSH ufw enable ufw status
第四步:在Docker服务器安装docker和docker-compose
-
安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
-
安装docker-compose
apt-get install docker-compose
-
开启docker远程访问
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
-
重启docker
systemctl daemon-reload systemctl restart docker
通过浏览器验证远程访问是否成功: http://192.168.124.248:2375/images/json
第五步:编写shell脚本、docker-compose.yml和Dockerfile,放到docker服务器的/home/benchu
-
demo-start.sh
app_name='xxxx-java' echo '通过docker-compose关闭容器' docker-compose down echo '删除老镜像' #docker images -a|grep none|awk '{print $3}'|xargs docker rmi docker rmi xxxx-java echo '创建新的镜像' docker build -t xxxx-java . echo '通过docker-compose启动容器' docker-compose up -d
-
demo-start.sh 添加执行权限
chmod 777 emo-start.sh
-
Dockerfile,最后一步 可以灵活配置多环境
# 基础镜像 FROM openjdk:8 # author MAINTAINER Stud # 挂载目录 VOLUME /home/benchu # 创建目录 RUN mkdir -p /home/benchu # 指定路径 WORKDIR /home/benchu # 复制jar文件到路径 COPY benchu-admin.jar /home/benchu/benchu-admin.jar # 启动应用 ENTRYPOINT ["java","-jar","benchu-admin.jar","--spring.profiles.active=test"]
-
docker-compose.yml
version: '3' services: benchu: container_name: 'xxxx-java' image: 'xxxx-java' restart: always environment: TZ: 'Asia/Shanghai' ports: - '8888:8888' volumes: - /home/jenkins/logs:/home/demo/logs
路径映射volumes,左边是宿主机,右边是docker容器.目前只把logs映射到宿主机,根据实际情况修改
第六步:通过浏览器配置jenkins,并新建构建视图
前面的配置git,SSH,jdk,maven和新建item的前半段就不赘述了,非常简单,网上教程也很多.
jenkins–系统管理–系统配置–Publish over SSH
从新建item的构建开始.
-
增加构建步骤 ==>> 调用顶层的maven目标
-
增加构建步骤 ==>> Send files or execute commands over SSH
-
增加构建步骤 ==>> Execute shell script on remote host using ssh (这些脚本理论上是可以放在上一步的,图片的cd目录写错了懒得改了)
cd /home/benchu echo '当前所在路径' pwd sh demo-start.sh
完结撒花
后续:分离lib
由于jenkins与docker服务器可能不是内网传输,带宽也不高,导致发包时间很长,下面基于以上配置,修改3个地方的文件
-
修改pom文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> <archive> <addMavenDescriptor>true</addMavenDescriptor> <manifest> <useUniqueVersions>false</useUniqueVersions> <addClasspath>true</addClasspath> <classpathPrefix>./lib</classpathPrefix> <mainClass>com.XXX.XXXXXXApplication</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>
-
修改Dockerfile (修改了最后一句,启动服务时指定lib)
ENTRYPOINT ["java","-jar","XXXX.jar","-Dloader.path=./lib","-Djava.ext.dirs=./lib","--spring.profiles.active=prod"]
-
修改docker-compose (把lib映射到docker)
- /home/xxx/lib:/home/xxx/lib
-
修改jenkins配置,如果本地打包时会把一些其他模块的代码打成jar包的话,则把所有模块都拷贝到服务器的lib里
-
至此,每次打包后,会在target里生成lib,如果lib发生变化(上一部中包含的不算),需要把lib拷贝到服务器的/home/xxx/lib里.