文章目录
- 概述
- Springboot后端应用
-
-
- [1. 准备工作](#1. 准备工作)
- [2. 创建项目结构](#2. 创建项目结构)
- [3. 编写 Dockerfile](#3. 编写 Dockerfile)
-
- [后端 Dockerfile (`backend/Dockerfile`)](#后端 Dockerfile (
backend/Dockerfile
))
- [后端 Dockerfile (`backend/Dockerfile`)](#后端 Dockerfile (
- [4. 创建 Jenkinsfile](#4. 创建 Jenkinsfile)
-
- [Jenkinsfile 示例:](#Jenkinsfile 示例:)
- [5. 设置 Jenkins Job](#5. 设置 Jenkins Job)
- [6. 运行 Pipeline](#6. 运行 Pipeline)
- [7. 持续集成与交付](#7. 持续集成与交付)
- [8. 监控与维护](#8. 监控与维护)
- 其他Jenkinsfile示例
-
概述
本文介绍如何使用Dockerfile+Jenkinsfile方式部署Java前后端应用
部署前端Vue应用
一、环境准备
项目中新增Docker文件夹
1、Dockerfile
# 拉取nginx基础镜像
FROM nginx:1.21.1
# 维护者信息
MAINTAINER zhengqingya
# 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
COPY dist/ /usr/share/nginx/html/
# 用本地配置文件来替换nginx镜像里的默认配置
COPY nginx/nginx.conf /etc/nginx/nginx.conf
# 对外暴漏的端口号
# [注:EXPOSE指令只是声明容器运行时提供的服务端口,给读者看有哪些端口,在运行时只会开启程序自身的端口!!]
EXPOSE 80
# 启动nginx容器
CMD ["nginx", "-g", "daemon off;"]
2、.dockerignore
node_modules
3、nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost; # 服务器地址或绑定域名
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
# =========================================================
# ================== ↓↓↓↓↓↓ start ↓↓↓↓↓↓ ==================
# =========================================================
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# =========================================================
# ================== ↑↑↑↑↑↑ end ↑↑↑↑↑↑ ==================
# =========================================================
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
4、Jenkinsfile
在项目根目录下新建Jenkinsfile
文件
pipeline {
agent any
environment {
APP_NAME = 'vue-web'
APP_PROFILE = 'prod'
APP_IMAGE = 'vue-web:dev'
APP_PORT = 88
}
stages {
stage('vue环境准备') {
steps {
sh """
# 下载依赖 & 构建dist
cnpm install && cnpm run build:${APP_PROFILE}
# 拷贝dist到Docker目录下
cp -r dist Docker/
"""
}
}
stage('构建Docker镜像') {
steps {
sh """
# 删除旧容器
docker ps -a | grep ${APP_NAME} | awk '{print \$1}' | xargs -i docker stop {} | xargs -i docker rm {}
# 删除旧镜像
docker images | grep ${APP_NAME} | awk '{print \$3}' | xargs -i docker rmi {}
# 进入Docker目录
cd Docker
# 构建镜像
docker build -f Dockerfile -t ${APP_IMAGE} . --no-cache
"""
}
}
stage('运行容器') {
steps {
sh """
docker run -d -p ${APP_PORT}:80 --restart=always --name ${APP_NAME} ${APP_IMAGE}
"""
}
}
}
}
二、Jenkins部署
1、新建任务
选择Pipeline
2、流水线
脚本路径:
Jenkinsfile
保存配置
3、Build Now
构建 & 访问
ip:88
Springboot后端应用
使用 Dockerfile 和 Jenkinsfile 的方式来部署 Java 前端和后端应用,可以实现一个高效的 CI/CD 流程。这个流程包括构建、测试、打包、创建 Docker 镜像、推送镜像到仓库以及部署到目标环境。下面是详细的步骤指南,涵盖了前后端分离的 Java 应用的部署。
1. 准备工作
- 安装和配置 Jenkins:确保你已经安装了 Jenkins,并且它能够访问你的代码仓库(如 GitHub 或 GitLab)。
- 安装必要的插件 :
- Git Plugin:用于从 Git 仓库拉取代码。
- Docker Pipeline Plugin:用于在 Jenkins Pipeline 中操作 Docker。
- Docker Hub / 私有仓库凭证:如果你打算将 Docker 镜像推送到 Docker Hub 或其他私有仓库,请确保 Jenkins 已经配置好相应的凭证。
- Docker 安装:确保 Jenkins 节点上安装并配置了 Docker。
2. 创建项目结构
假设你有一个包含后端的应用,目录结构如下:
my-java-app/
├── backend/
│ ├── src/
│ ├── pom.xml (或 build.gradle)
│ └── Dockerfile
3. 编写 Dockerfile
后端 Dockerfile (backend/Dockerfile
)
Dockerfile
# 使用官方的 OpenJDK 镜像作为基础镜像
FROM eclipse-temurin:17-jdk-alpine
# 维护者信息 (可选)
LABEL maintainer="your-email@example.com"
# 设置工作目录
WORKDIR /app
# 将本地的 myapp.jar 复制到容器中的 /app 目录下
COPY target/myapp.jar /app/myapp.jar
# 暴露应用监听的端口 (默认为8080)
EXPOSE 8080
# 启动命令,使用 java 命令来运行 jar 文件
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
4. 创建 Jenkinsfile
在项目的根目录下创建 Jenkinsfile
来定义 CI/CD 流程。
Jenkinsfile 示例:
groovy
pipeline {
agent any
environment {
DOCKER_IMAGE_BACKEND = 'my-backend-app'
DOCKER_TAG_BACKEND = "latest"
DOCKER_HUB_CREDENTIALS_ID = 'docker-hub-credentials-id' // 替换为你的凭证 ID
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your-repo-url.git'
}
}
stage('Build Backend') {
steps {
dir('backend') {
sh './mvnw clean package -DskipTests' // 使用 Maven 构建,如果使用 Gradle,则改为 ./gradlew build -x test
}
}
}
stage('Build Docker Images') {
parallel {
stage('Backend Image') {
steps {
script {
docker.build("${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}", 'backend')
}
}
}
}
}
stage('Push Docker Images') {
parallel {
stage('Push Backend Image') {
steps {
script {
docker.withRegistry('https://registry.hub.docker.com', "${env.DOCKER_HUB_CREDENTIALS_ID}") {
docker.image("${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}").push()
}
}
}
}
}
}
stage('Deploy') {
steps {
script {
// 这里可以根据实际情况添加部署逻辑,例如通过 Docker Compose 或 Kubernetes 部署
// 下面是一个简单的示例,直接运行容器
def backendContainer = docker.run("-d --name my-backend-container -p 8080:8080 ${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}")
}
}
}
}
post {
always {
// 清理工作空间或其他清理任务
cleanWs()
}
}
}
5. 设置 Jenkins Job
- 在 Jenkins 中创建一个新的 Pipeline Job。
- 将
Pipeline script from SCM
选项设置为 Git,并指定你的仓库 URL 和分支。 - 如果你在仓库中有
Jenkinsfile
,选择它作为 Pipeline 的定义文件。 - 配置构建触发器(例如,基于 Git 提交或定时触发)。
6. 运行 Pipeline
一旦所有配置完成,点击"立即构建"按钮来手动触发一次构建,或者等待自动触发条件满足时自动执行。
7. 持续集成与交付
- 持续集成 (CI):每次代码提交后,Jenkins 会自动拉取最新代码并运行测试,确保代码质量。
- 持续交付 (CD):构建成功后,Jenkins 会自动创建 Docker 镜像并将其推送到仓库,然后根据配置部署到目标环境。
8. 监控与维护
- 日志查看:通过 Jenkins UI 查看构建和部署的日志输出,以便快速定位问题。
- 健康检查:为应用设置健康检查端点,并在 Jenkins 中配置相应检查以确保服务正常运行。
- 回滚策略:考虑实现回滚机制,以便在新版本出现问题时能够迅速恢复到上一个稳定版本。
其他Jenkinsfile示例
bash
pipeline{
agent {
label 'MVN3'
}
stages{
stage('clone'){
steps{
git url: 'https://github.com/tarunkumarpendem/shopi
zer.git',
branch: 'master'
}
}
stage ('build') {
steps {
sh 'mvn clean package'
}
}
stage('Build the Code') {
steps {
withSonarQubeEnv('sonarcloud') {
sh script: 'mvn clean package sonar:sonar'
}
}
stage('archiving-artifacts'){
steps{
archiveArtifacts artifacts: '**/target/*.jar', followSymlinks: false
}
}
stage('junit_reports'){
steps{
junit '**/surefire-reports/*.xml'
}
}
}
pipeline {
agent {label 'OPENJDK-11-JDK'}
triggers {
pollSCM('0 17 * * *')
}
stages {
stage('vcs') {
steps {
git branch: 'release', url: 'https://github.com/longflewtinku/shopizer.git'
}
}
stage('merge') {
steps {
sh 'git checkout devops'
sh 'git merge release --no-ff'
}
}
stage('build') {
steps {
sh 'mvn clean install'
}
}
}
}