Docker+Jenkins+Gitee+Pipeline部署项目

news2024/11/28 20:49:08

1.前言

Hello,各位小伙伴大家好。😄

在上一篇文章【Docker+Jenkins+Gitee自动化部署maven项目】中,咱们详细介绍了如何自动化部署maven项目,如果说你的项目仅仅为maven项目,那么这种部署方式是很契合的,如果我们想要支持更多类型的项目,这种方式就显得有点捉襟见肘了。于是乎,Pipeline流水线任务闪亮登场。如下图所示:

Pipeline流水线任务可以让我们定制整个任务的执行流程,使得其更加的灵活。怎么样,各位小伙伴是不是已经跃跃欲试了。😄

2.Pipeline介绍

这里我们又引入了一个新的概念:Pipeline,没接触过的小伙伴,这时肯定是一脸懵逼了,心中充满了疑问。

  • Pipeline是何方神圣?
  • Pipeline应该如何使用?

2.1 Pipeline是什么

Pipeline:翻译过来有管道、流水线的意思,简单来说,其定义了一个工作流模型,将原来分布在多个节点的任务组织成一个任务,实现复杂的编排工作。

不知道大家对这个选项还有没有印象,这就是典型的一个大的任务分布在多个小的任务节点上,当一个小的任务执行完成后,通知下一个任务执行。

我们都知道在汽车流水线中,分布着不同的生产单元,每一个生产单元只专注处理各自的分工,Jenkins的Pipeline也有异曲同工之妙。

2.2 如何使用Pipeline

到这里,相信大家心中对Pipeline的定义已经有一定的理解了,现在要看的就是如何来使用它了。

创建一个Pipeline任务需要我们提供一个Pipeline脚本,其基于Groovy语法。

Pipeline脚本支持两种语法:声明式(Declarative)语法和脚本式(Scripted)语法。

2.2.1 声明式(Declarative)语法

先来看个最简单的示例:

pipeline {
    agent any
    stages {
        stage('git pull') {
            steps {
                echo "git pull"
            }
        }
        stage('mvn package'){
            steps{
                echo "mvn package"
            }
        }
        stage('deploy'){
            steps{
                echo "deploy"
            }
        }
    }
}

总的来说,声明式语法的结构还是很清晰明了的,主要包含pipelinestagesstagesteps块。

  • pipeline:见名知意,用来定义一个Pipeline。
  • stage:用来定义Pipeline的一个阶段,需定义在stages块中。
  • steps:用来定义一个阶段中存在的步骤,例如各种shell命令。

2.2.2 脚本式(Scripted)语法

node {
    stage('deploy'){
        steps{
            echo "deploy"
        }
    }
    stage('mvn package'){
        steps{
            echo "mvn package"
        }
    }
    stage('deploy'){
        steps{
            echo "deploy"
        }
    }
}
  • node:含义同声明式语法的pipeline,用来定义一个Pipeline
  • stage:用来定义Pipeline的一个阶段。
  • steps:用来定义一个阶段中存在的步骤,例如各种shell命令。

相比声明式语法,脚本式语法的层次结构没有那么清晰,因此,Jenkins推荐使用声明式语法

3.构建过程

先来看看我这里准备的项目,一个简单的SpringBoot项目。

那么就可以总结出部署过程,如下:

  • 从Gitee远程仓库拉取代码。
  • Maven编译打包。
  • Docker构建镜像并运行。

4.准备工作

4.1 添加凭据

第一步就是从Gitee远程仓库拉取代码,因此需要Gitee SSH key。这个之前我们之前已经添加过,这里就不再添加了。具体参照【Docker+Jenkins+Gitee自动化部署maven项目】一文。

4.2 Maven环境变量

第二步是使用Maven对拉取下来的代码编译打包,因此需要配置MAVEN_HOME。前面我们提到过,Jenkins自动安装的Maven环境目录在/var/jenkins_home/tools/中。

4.3 构建镜像并运行

第三步Docker构建镜像并运行,这里我准备了Dockerfile和deploy.sh脚本。

Dockerfile

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:11-jre   as builder
# 执行工作目录
WORKDIR apps
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

# 正式构建镜像
FROM openjdk:11-jre
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR apps
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder apps/dependencies/ ./
COPY --from=builder apps/spring-boot-loader/ ./
COPY --from=builder apps/snapshot-dependencies/ ./
COPY --from=builder apps/application/ ./
ENTRYPOINT java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher

deploy.sh

#!/bin/bash
# 服务名称
SERVER_NAME=$1
# 镜像tag
IMAGE_TAG=$2
# 镜像名称
IMAGE_NAME=$SERVER_NAME:$IMAGE_TAG
echo "------ 开始构建镜像:${SERVER_NAME} ------"
docker build -t ${IMAGE_NAME} .
echo "------ 镜像构建结束:${IMAGE_NAME} ------"
if [[ -n $(docker ps -q -f "name=^${SERVER_NAME}$") ]];then
    echo "------ 容器正在运行:${SERVER_NAME} ------"
    echo "------ 停止容器:$SERVER_NAME ------"
    docker stop $SERVER_NAME
    echo "------ 删除容器:$SERVER_NAME ------"
    docker rm $SERVER_NAME
else
    echo "------ 容器未在运行:${SERVER_NAME} ------"
    echo "------ 删除容器:$SERVER_NAME ------"
    docker rm $SERVER_NAME
fi

echo "------ 开始运行容器:$SERVER_NAME ------"
docker run -d --name $SERVER_NAME -p 9090:9090 ${IMAGE_NAME}
echo "------ 清理虚悬镜像 ------"
if [[ -n $(docker images | grep "none" | awk '{print $3}') ]];then
    docker rmi -f $(docker images | grep "none" | awk '{print $3}')
fi

4.4 pipeline脚本

最后的最后,我们需要把前面3个步骤整合一个Pipeline脚本中,这也是Pipeline流水线任务的优势所在。

pipeline {
    agent any
    stages {
        // 拉取代码
        stage('git pull') {
            steps {
                git credentialsId: 'c6adcee5-a169-466a-88ce-9f1eaf0eabbb', url: 'xx/jenkins-test.git'
            }
        }
        // 编译打包
        stage('mvn package'){
            steps{
                sh 'mvn clean package -Dmaven.test.skip=true'
            }
        }
        // 构建docker镜像并运行,${JOB_NAME}为Jenkins内置变量
        stage('deploy'){
            steps{
                sh 'bash /var/jenkins_home/sh/deploy.sh ${JOB_NAME} master'
            }
        }
    }
}

可能这里各位小伙伴有些疑惑,拉取代码的脚本怎么是这样的?

git credentialsId: 'c6adcee5-a169-466a-88ce-9f1eaf0eabbb', url: 'xx/jenkins-test.git'

其实这里使用了Jenkins提供的片段生成器,访问地址为YOUR_JENKINS_URL/pipeline-syntax,例如我这里就是http://192.168.110.101:8080/pipeline-syntax/

5.Jenkins+Pipeline部署项目

5.1 创建pipeline任务

好了,到这里我们前期的准备工作也做的差不多了,就可以开始创建Pipeline任务了。

定义pipeline脚本。有两种方式:

Pipeline script:直接在文本界面上定义pipeline脚本。

Pipeline script from SCM:将pipeline脚本定义在Jenkinsfile中,然后从仓库中拉取,其可以更好地对脚本文件进行版本控制。推荐使用,我这里也是使用的这种方式。

5.2 手动部署

点击立即构建,出现以下界面,表示任务执行成功。由于我是使用虚拟机搭建的服务器,上篇文章我们介绍了ngrok外网映射的方式来实现WebHook触发自动构建,这里就不再介绍了。

6.总结

如果看过【Docker+Jenkins+Gitee自动化部署maven项目】文章小伙伴,对比Pipeline流水线任务,或许会觉得直接创建构建maven任务还更加滴简单,是的,我此刻也有这种感受。

不过,那种方式只适用于maven单模块项目,如果是微服务项目或者其他语言的项目,就无能为力了。

我们这里也只算是简单的介绍了Pipeline流水线任务的用法,后续会继续探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超全,Selenium4自动化测试并行测试详解,进阶之路看这篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Selenium4 自动化测…

万字解析PELT算法!

Linux是一个通用操作系统的内核,她的目标是星辰大海,上到网络服务器,下至嵌入式设备都能运行良好。做一款好的linux进程调度器是一项非常具有挑战性的任务,因为设计约束太多了: 它必须是公平的快速响应系统的throughp…

如何学习R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合?

专题一:Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1) 什么是Meta分析 2) Meta分析的选题策略 3) 文献检索数据库 4) 精确检索策略,如何检索全、检索准 5) 文献的管理与清洗,如何制定文献纳入排除标准 6…

第一行代码 第十四章 开发酷欧天气

第14章 开发酷欧天气 在本章将编写一个功能较为完整的天气预报程序。 功能需求及技术可行性分析 在开始编码之前,需要先对程序进行需求分析,想一想酷欧天气中应该具备哪些功能。将这些功能全部整理出来: 可以罗列出全国所有的省、市、县&…

英飞凌 AURIX-TC3XX:QSPI通信实验

目录 AURIX-TC3XX-QSPI通信实验1.QSP简介1.1、AURIX TC3XX QSPI个数1.2、QSPI功能特点1.2.1、QSPI外设的新特性1.2.2、一些独特的特性1.2.3、支持传统的SPI特性1.2.4、四种可供用户选择的传输模式 2、具体实验操作2.1、新建工程2.2、实验一 3、域控制器中常见的SPI通信方式3.1、…

ble常见概念

0. 蓝牙一些常见概念 参考:https://www.bilibili.com/video/BV1ad4y1d7AM 基于ESP32来了解蓝牙协议的一些东西 蓝牙广播 包组成结构 低功耗蓝牙一共有40个信道,频段范围从2402Mhz-2480Mhz,每2Mhz一个信道,37 38 39 是广播信道…

基于linux的程序库文件打包和调用的实现(一)——静态库文件打包和调用

随着技术的发展,基于linux项目的软件代码越发复杂,原来一个人可以完成的软件项目,现在可能需要多个人合作、多个部门合作、多个企业合作,每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企…

DeFi 发展沃土,Uniswap 成功“登陆” Moonbeam

作者:OneBlock 去年 3 月底,Uniswap 社区发布一项全新治理提案,旨在通过社区授权于 Polkadot 生态智能合约平台 Moonbeam 上部署 Uniswap V3,将 Uniswap 扩展至 Polkadot 生态。在这项提案中,Uniswap 计划除了提供流动…

极兔抢滩IPO,李杰不止缺一个丰网

(图片来源于网络,侵删) 来源 | 螳螂观察 文 | 叶小安 物流业打响了上市“抢滩战”。 5月,顺丰控股传出2023年在香港二次上市消息;紧接着极兔也传出将于下半年赴港上市消息;另一边,阿里主席张…

最新自助建站系统源码 一键建站系统源码 含700+精美网站模板和搭建教程

分享一款最新自助建站系统源码,一键建站系统源码,傻瓜式一键建站含700精美网站模板,网站全是自适应响应式,含完整代码程序包和详细搭建教程。 系统模板页面图: 系统功能特色一览: 1、一次性打包&#xff0…

chatgpt接口返回参数分析

接口请求使用二进制请求,数据流式返回,即分块(分批次)返回。 问题:一周有几天 请求头 参数详解 参数名称 说明 role 消息发送者的角色,这里为 "assistant"。 id 消息的唯一标识符。 pare…

图的基本概念和存储

基本概念 基本概念 图的定义:图(Graph)一般由两个集合共同构成,一个是非空但是有限的顶点集合V(Vertex),另一个是描述顶点之间连接关系的边集合E(Edge),边集合可以为…

4.信息安全之数据恢复

1.数据容灾数据备份 RPO(recovery point object)数据恢复点目标 数据丢掉多少可接受 RTO(recovery time object)数据恢复时间目标 恢复数据需要多少时间 2.系统灾难原因 1.硬件 2.人为 3.软件 4.病毒 5.自然灾害 3.容灾级别 数据级别(数据出错)<应用(某个功能不能使用)<业…

运维小白必学篇之基础篇第二集:文件系统结构和目录管理

文件系统结构和目录管理实验 实验者&#xff1a;胡 阳 目录 一、将虚拟机主机名改为自己的名字 二、完成以下操作&#xff1a; 一、将虚拟机主机名改为自己的名字 例如&#xff1a;hostname liangyuntong 关闭该终端后&#xff0c;重新打开即可 二、完成以下操作&#…

【AIGC】CPM-BEE 开源大模型介绍、部署以及创建接口服务

终于! 中文基座模型CPM-Bee开源了 # CPM-Bee 百亿参数的开源中英文双语基座大模型 ✨ 模型介绍 CPM-Bee是一个完全开源、允许商用的百亿参数中英文基座模型&#xff0c;也是CPM-Live训练的第二个里程碑。它采用Transformer自回归架构&#xff08;auto-regressive&#xff0…

直播预告丨SaaS+CG?UE影视级场景渲染与科学制片全流程揭秘!

余热不减&#xff01;在第二届瑞云3D渲染动画创作大赛赛果公布 后&#xff0c;小瑞紧锣密鼓在安排获奖选手的系列专场直播。在上期的“ 泛CG 聚未来 ” 第四届实用技术线上分享会中,咱们邀请到大赛专业组冠亚军“3ds Max老法师”彼尔德和“Maya大神”Shuiguo 分享了自己的创作历…

cplex基础入门(一)

这边文章会以纯新手小白的视角&#xff0c;教会大家如何快速的搭建自己的cplex模型&#xff0c;做到求解模型不求人。 目录 一、引言 1、掌握数据类型及数据结构 2、常规Cplex编程方法 3、Cplex编程步骤 4、cplex 程序框架 5、创建模型 二、规划建模的入门求解案例 1、…

代码随想录训练营Day57| 647. 回文子串 516.最长回文子序列 动态规划总结篇

目录 学习目标 学习内容 647. 回文子串 516.最长回文子序列 学习目标 647. 回文子串 516.最长回文子序列 动态规划总结篇 学习内容 647. 回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/palindromic-substrings/ class S…

3.部署 Stable Diffusion(SD)

部署Stable Diffusion webui方式: 本地部署:在自己的电脑上安装(官方脚本部署、懒人包部署(文末自取)) 云端部署:在远程服务上运行(免费有时长限制、可付费租用GPU) 两种部署方式哪种都可以,看需选择。如果有性能比较不错的的显卡,那么可以考虑本地部署。如果是没…

java养老院老年人档案管理系统springboot+vue

本居家养老系统管理员和工作人员两个角色。管理员功能有个人中心&#xff0c;老人账号管理&#xff0c;工作人员管理&#xff0c;老人档案管理&#xff0c;订单申请管理&#xff0c;检查检验项目管理&#xff0c;维修服务管理&#xff0c;订单信息管理&#xff0c;转诊信息管理…