服务器资源与角色

身份 角色 ip 版本
服务器 Gitlab 10.0.0.133 Rocky Linux 9
服务器 Jenkins 10.0.0.134 Rocky Linux 9
服务器 Web 10.0.0.135 Rocky Linux 9
服务器 APP 10.0.0.137 Rocky Linux 9
中间件 Nginx - 1.20.1
中间件 JDK - OpenJDK 17
中间件 Maven - 3.6.3
中间件 Git - 2.47.3
  • 基于之前的 前端项目myweb 和 后端项目myapp ,我们是将它们分别发送到对应服务器上直接运行,而在现在的实际业务环境中项目大概率是以docker容器的方式运行的,这样便于直接观察项目的状态和资源的分配

  • 先理清发布的思路

    • 1、 编写Dockerfile文件并上传到Gitlab

    • 2、 Jenkins拉取代码并推送到目标服务器

    • 3、 如果已存在镜像先删除旧镜像

    • 4、 目标服务器根据接收到的Dockerfile文件构建镜像

一、构建前端项目容器

1.Gitlab新增Docker配置

  • 在Gitlab的myweb项目中添加docker文件夹,在其中创建dockerfile文件

  • 编辑dockerfile,添加自定义容器信息

    • 因为我们的网页文件名为myweb.html,我们是以nginx容器方式代理网页,nginx默认配置是先加载index,html,所以我们在配置中先删除容器内/usr/share/nginx/html路径下的内容,后用COPY指令将myweb.html复制到容器内/usr/share/nginx/html路径下

    • 这里因为我们已经将主页文件命名为myweb.html,而规范是主页文件名是index.html,规范命名可以不用改任何配置就可让nginx代理,对于此项目非规范命名我们可以:添加nginx配置文件,让myweb容器的nginx基于此自定义配置文件构建,另外简单做法是将项目命名规范化。这里为了节省时间,我们直接重命名一下

FROM nginx:1.20.1
​
RUN rm -rf /usr/share/nginx/html/*
​
COPY . /usr/share/nginx/html
​
RUN mv /usr/share/nginx/html/myweb.html /usr/share/nginx/html/index.html 
​
EXPOSE 82
​
CMD ["nginx", "-g", "daemon off;"]
添加dockerfile

2.Jenkins配置任务

- 新建任务

  • 在Jenkins主页点击新建任务输入任务名称myweb-docker并选择构建一个自由风格的项目,最后点击确定

  • 源码管理依旧选择Git,然后Repository URL输入仓库地址http://85.137.247.103:8765/root/myweb.git

  • 分支名与Gitlab一致,保存后可以先构建查看日志,验证仓库是否配置成功

配置myweb-docker

- 配置web服务器

在拉取代码成功后,就需要将其推送到web服务器,这里我们使用Publish Over SSH插件,可以使用这个插件配置连接指定服务器,并执行相关命令、

  • 在Jenkins系统管理 -> 插件管理Available plugins搜索Publish Over SSH插件并安装

  • 在Jenkins系统管理 -> 系统设置中,拉到最下边可以看到该插件提供的相关设置,点击新增,添加web服务器相关信息

    • Name自定义,作为服务器在Jenkins中的标识

    • Hostname为目标服务器IP

    • Username为登录用户名

    • Remote Directory为登录目标服务器后的工作目录,如果该目录不存在,则需要去目标服务器手动创建

  • 点击高级,勾选Use password authentication, or use a different key,在Passphrase / Password填写登录用户名对应的密码

配置服务器
  • 当我们配置好目标服务器信息,创建好目录后,点击最下边Test Configuration后无任何错误信息就是配置成功,点击应用后保存

- 推送配置

  • 在myweb-docker任务配置中下拉,找到构建后操作点击增加构建后操作步骤选择Send build artifacts over SSH

  • 在SSH Server中,Name选择我们之前在系统设置中配置的目标服务器名称

    • Transfer SetSource files代表将Jenkins所在服务器那些文件复制到目标服务器,这里我们选择将当前路径下所有文件:**/*

    • Exec command为复制后需要在目标服务器执行的命令,这里我们进入目标目录cd /usr/local/myapp-docker,然后实现:a.停止并删除旧容器;b.删除旧镜像并构建新镜像;c.将新镜像运行成容器

  • 在第一次执行之前,先将构建镜像和运行容器的命令在服务器执行一次,否则a步骤会报错

# 进入Jenkins推送文件的目录
cd /usr/local/myweb-docker
​
# 停止并删除旧容器
docker stop myweb
docker rm myweb 
​
# 删除旧镜像
docker rmi myweb-image:latest
​
# 重新构建镜像
docker build -t myweb-image:latest -f docker/dockerfile .
​
# 重新运行容器
docker run -d -p 82:80 --name myweb myweb-image:latest
推送配置
  • 然后点击构建,观察控制台输出发现Jenkins任务执行成功

推送配置

3.浏览器访问

  • 任务构建成功后,web服务器上docker容器已经启动,我们访问对应ip和端口http://10.0.0.135:82/就可以看到我们自己的前端页面

浏览器访问

二、构建后端Maven项目容器

  • 基于之前完成的myapp项目,将其打包构建成运行在后端app服务器的docker容器

1.Gitlab新增Docker配置

- 编写dockerfile

  • 我们首先基于docker构建流程的完成dockerfile的编写,通过dockerfile的内容构建自定义镜像

    • 在idea中为myapp项目创建docker目录与dockerfile文件

    • 为方便管理,修改pom.xml文件来配置maven打包后的jar包名

    • 编写dockerfile文件内容,上传Gitlab仓库

idea中打开myapp项目的pom.xml文件,修改后刷新maven配置

<!-- 在build块中添加finalName配置,此配置为配置构建后的jar包名字 -->
<build>
    <finalName>myapp</finalName>
    ···
</build>
# 镜像基于openjdk 17构建
FROM docker.io/openjdk:17
​
# 复制构建后的jar包到容器内指定目录
COPY myapp.jar /usr/local/myapp-docker/
​
# 设置该容器工作目录
WORKDIR /usr/local/myapp-docker/
​
# 运行目录下的myapp.jar
CMD java -jar myapp.jar

docker配置

- 编写docker-compose.yml

  • 编写好dockerfile文件后,我们就可以将Gitlab代码仓库的内容构建成镜像,然后我们通过docker-compose将这个镜像运行成我们需要的容器

  • 所以我们继续在idea项目的docker目录中新建docker-compose.yml文件,后续通过这个文件的配置将运行dockerfile构建的自定义镜像运行成容器,并做好相关配置

# 指定Compose文件的版本
version: '5.0'  
​
services: 
  # 自定义的服务名称
  myapp:  
    # 构建镜像的配置
    build:  
      # 指定Docker构建镜像时的根目录
      context: ./  
      # 指定构建镜像使用的Dockerfile文件名
      dockerfile: dockerfile  
    # 构建后的镜像名称和标签
    image: myapp:v1.0.0  
    # 容器的自定义名称
    container_name: myapp  
    # 端口映射
    ports:  
      - 8081:8080
  • 然后用idea已经配置好的git推送变更到Gitlab的myapp代码仓库

推送变更

2.Jenkins配置任务

- 新建任务

  • 在Jenkins主页点击新建任务输入任务名称myapp-docker并选择构建一个自由风格的项目,最后点击确定

  • 源码管理依旧选择Git,然后Repository URL输入仓库地址http://85.137.247.103:8765/root/myapp.git

  • 分支名与Gitlab一致,保存后可以先构建查看日志,验证仓库是否配置成功

新建任务

- 构建项目

  • Build Steps中增加构建步骤,选择调用顶层MAVEN目标

    • Maven 版本选择为之前全局配置自定义的别名

    • 目标就是maven构建项目的命令:clean package -DskipTests

构建项目
  • 我们可以构建一次查看控制台输出验证配置是否正确,首次构建maven会下载相关依赖,可能耗时较长

  • 我们也可以登录Jenkins服务器进入mytest-docker任务工作目录/var/lib/jenkins/workspace/myapp-docker,发现这里生成了一个target目录,这就是构建后jar包所在路径,可以找到构建好并且已配置命名的jar包myapp.jar

构建项目

- 推送文件

  • 我们之前已经在Publish Over SSH插件中配置好了目标服务器,所以我们直接增加构建后操作步骤,选择Send build artifacts over SSH,然后选择后端配置好的application服务器,Source files中选择推送target目录中构建好的jar包:target/*.jar以及后续运行容器需要的dockerfile和docker-compose.yml文件:docker/*

  • 之后点击构建,登录application服务器验证是否推送成功

构建项目

- 运行成容器

  • 文件推送成功后,我们在Exec command中写入构建运行容器的命令

    • 因为在Publish Over SSH中配置的==目标服务器指定目录==Remote Directory/usr/local/myapp,而使用docker-compose运行容器时,需要当前目录下有docker-compose.yml文件,所以我们先进入docker目录后运行后续命令,为防止歧义用绝对路径:cd /usr/local/myapp/docker

    • 然后我们在dockerfile中配置的COPY myapp.jar /usr/local/myapp-docker/是将当前目录下的myapp.jar复制到容器内,而docker文件夹并无此文件,所以我们需要将上层目录的target目录中的jar包移动到当前目录:mv ../target/*.jar ./

    • 然后我们就可以通过docker-compose up -d --build将我们的自定义镜像构建并且运行起来,但是我们可能会多次构建运行这个容器,所以为避免冲突,我们先停止之前运行的容器:docker-compose down

  • 建议先在application服务器运行以下命令,先构建一次镜像

cd /usr/local/myapp/docker
mv ../target/*.jar ./
docker-compose down
docker-compose up -d --build
构建项目

- 构建任务

  • 点击构建,查看日志成功,进入application服务器查看镜像与容器状态

构建任务

3.浏览器访问

  • 进入浏览器访问:http://10.0.0.137:8081/test,访问到与本地测试时一致的页面即为通过Jenkins发布成功

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐