centos7系统使用docker-compose安装部署jenkins

news2024/11/24 0:35:06

CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建

记录一次在给公司部署jenkins的真实经历,总结了相关经验

1.准备环境

1.java

由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安装好后使用jenkins容器里自带的jdk17

在这里插入图片描述

2.maven

centos7安装maven

1.下载 apache-maven-3.6.3-bin.tar.gz

2.解压

3.vim /etc/profile

​ source /etc/profile

3.node

centos7 使用nvm 下载16以上版本的node可能会遇到如下的报错

在这里插入图片描述

这里直接采用jenkins自动安装node 18

在这里插入图片描述

2.准备docker-compose.yml文件

version : '3'
services:
  jenkins:
    user: root
    restart: always
    image: jenkins/jenkins
    container_name: jenkins
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "10240:8080"
      - "10241:50000"![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/857e2cfde42a4643bc486ddbf36d3578.png)

    expose:
      - "8080"
      - "50000"
    volumes:
      - /data/jenkins/jenkins_home/:/var/jenkins_home/
      - /data/nginx/html/:/data/nginx/html/
      - /data/nginx/htmldev/:/data/nginx/htmldev/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /data/maven/apache-maven-3.6.3:/data/maven/apache-maven-3.6.3
      - /root/.ssh:/root/.ssh
  1. /var/jenkins_home/ 这个是容器里默认的jenkins工作目录,需要挂载出来
  2. /data/nginx/html/和/data/nginx/htmldev/ 分别对应后面前端项目pc端、移动端的dist存放目录,配置于nginx中,挂载出来是由于jenkins配置前端构建的时候需要配置nginx目录
  3. maven挂载刚刚安装的maven

3.执行docker-compose

# 跳转到docker-compose.yml文件目录
cd /data/jenkins

ll

#执行
docker-compose up -d

#查看运行状态
docker ps

4.初始化jenkins

  1. 访问 ip:10240 jenkins后台

    在这里插入图片描述

    查找初始密码

    在这里插入图片描述

  2. 安装插件

    选择安装推荐的插件,这里如果安装失败,后续再手动切换源,安装必要的插件即可

    源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    在这里插入图片描述

    docker安装jenkins并配置国内插件镜像地址_jenkins国内镜像-CSDN博客

    Jenkins必备安装插件 - 知乎 (zhihu.com)

    在这里插入图片描述

  3. 创建管理员账号

    在这里插入图片描述

    一直下一步

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 切换中文(此时还有部分界面是英文)

​ 安装locale插件即可

​ 【jenkins】教你jenkins设置为中文_jenkins 中文插件,2024年最新这操作真香_jenkins设置中文-CSDN博客

5.系统配置

  1. 凭据管理

    在这里插入图片描述

    在这里插入图片描述

    添加全局凭据

    1. git账号密码(拉取代码)

      在这里插入图片描述

    2. gitlab token(用于监听git,自动构建)

      安装gitlab插件

      在这里插入图片描述

      去gitlab生成token,复制

      在这里插入图片描述

      添加gitlab api token凭证

      在这里插入图片描述

  2. 全局工具配置

    1. JDK

      使用jenkins容器自带jdk17

      在这里插入图片描述

    2. maven

      使用本地安装的maven,刚刚已经挂载

      在这里插入图片描述

    3. nodejs

      安装nodejs插件

      在这里插入图片描述

      勾选自动安装,node版本选择18

      在这里插入图片描述

  3. 系统配置

    在这里插入图片描述

    1. 远程部署配置

      安装远程部署插件

      在这里插入图片描述

      配置publish over ssh - SSH Servers

      1. 远程部署客户测试环境

        在这里插入图片描述

      2. 远程部署公司开发环境

        在这里插入图片描述

    2. gitlab连接配置

      在这里插入图片描述

6.新建构建任务

1.后端(含备份、回滚)

1.本机部署

举例:构建测试服务器(本地),从git的develop分支拉取代码

  1. 选择自由风格

    在这里插入图片描述

  2. 设置保留构建历史数量

    在这里插入图片描述

  3. 配置参数化构建,为了实现回滚

    在这里插入图片描述

    在这里插入图片描述

  4. 配置源码管理

    在这里插入图片描述

  5. 构建环境

    在这里插入图片描述

  6. 增加构建步骤

    maven

    在这里插入图片描述

    备份

    在这里插入图片描述

    #!/bin/bash 
    case $Status  in
      deploy)
        echo "Status:$Status"
        path="${WORKSPACE}/csms-admin/bak/${BUILD_NUMBER}"      #创建每次要备份的目录
        if [ -d $path ];
        then
            echo "The files is already  exists "
        else
            mkdir -p  $path
        fi
        \cp -f ${WORKSPACE}/csms-admin/target/*.jar $path        #将打包好的jar包备份到相应目录,覆盖已存在的目标
        echo "bak ------------ Completing!"
        ;;
      rollback)
          echo "Status:$Status"
          echo "Version:$Version"
          echo "BUILD_NUMBER:$BUILD_NUMBER"
          v=$Version
          if [ $Version -eq 0 ]; then
            v=$(($BUILD_NUMBER - 2))  # 如果 $Version 是 0,则赋值为 $BUILD_NUMBER - 2
          fi
          echo "回滚到版本--v:${v}"
          cd ${WORKSPACE}/csms-admin/bak/${v}            #进入备份目录
          \cp -f *.jar ${WORKSPACE}/csms-admin/target/       #将备份拷贝到程序打包目录中,并覆盖之前的jar包
          ;;
      *)
      exit
          ;;
    esac
    

    构建新docker镜像并启动

    在这里插入图片描述

    cd ${WORKSPACE}
    docker stop csms-admin || true
    docker rm csms-admin || true
    docker rmi csms-admin || true
    docker build --build-arg profileActive=test --build-arg port=8889 -t csms-admin .
    docker run -d -p 192.168.100.53:8889:8889 --name csms-admin csms-admin
    

    保留10个版本,删除以前的备份

    在这里插入图片描述

    #!/bin/bash
    #rm_file>14day
    ReservedNum=10                      #保留文件数量
    rm_file_dir=${WORKSPACE}/csms-admin/bak  #需要删除文件的路径
    
    cd $rm_file_dir    #进入文件夹
    RootDir=$(pwd) #当前文件路径
    FileNum=$(ls -l | grep '^d' | wc -l)    #查找文件夹数量
    OldFile=$(ls -rt | head -1)         #找出最早文件夹
    if [ $RootDir == $rm_file_dir ];then   #判断所在目录是否正确
        echo $RootDir                             
        echo $rm_file_dir
        while (($FileNum>$ReservedNum))  #文件数超过设置变量才执行
        do
        echo "Delete File:"$RootDir'/'$OldFile   #打印要删除的文件名称
        rm -rf $RootDir'/'$OldFile                       #删除文件
        let "FileNum--"                                      #变量自减操作
        OldFile=$(ls -rt | head -1)         #更新dmp最早文件
        done
    else
        echo "error file path "                         #所在目录不对打印出路径错误
    fi
    
  7. 构建触发器

    配置gitlab监听,自动构建

    在这里插入图片描述

    在这里插入图片描述

    打开gitlab

    在这里插入图片描述

    在这里插入图片描述

    分别粘贴到gitlab-设置-集成

    在这里插入图片描述

  8. 测试

    在这里插入图片描述

    在这里插入图片描述

    git push自动触发jenkins构建

    查看控制台

    在这里插入图片描述

    查看docker容器运行状态

    docker ps
    

    在这里插入图片描述

    后端启动成功

2.远程部署

举例:构建开发服务器(另一台服务器),采用在本机打包、备份,然后通过ssh连接远程开发服务器,传送jar包并执行的方式

  1. 复制一个构建任务

    在这里插入图片描述

    在这里插入图片描述

  2. 修改所有的profile环境,注释docker步骤

    在这里插入图片描述

    在这里插入图片描述

  3. git触发器配置

    (同上)

  4. 增加Send files or execute commands over SSH 步骤

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    #!/bin/bash
    
    JAR_HOME='/data/jenkins/jenkins_home/workspace/csms-dev-develop/csms-admin/target'
    WEB_HOME='/data/csms/csms-admin'
    
    #停止原来的服务
    ps -ef | grep csms-admin | grep -v grep | awk '{print $2}' | xargs kill -9
    
    #替换原来的jar包
    cd ${JAR_HOME}
    mv csms-admin-dev.jar csms-admin.jar
    cp -f csms-admin.jar ${WEB_HOME}
    
    #重启服务
    cd ${WEB_HOME}
    nohup sh startup.sh &
    

    startup.sh

    
    #!/bin/bash
    #1,获取myjar的进程号
    PID=$(ps -ef|grep csms-admin| grep -v grep | awk '{print $2}')
    #2,启动myjar的函数
    start(){
            nohup /data/java/jdk1.8.0_321/bin/java -Dspring.profiles.active=dev -jar -Xms1024m -Xms2048m csms-admin.jar &
    }
    #3,判断1中获取的PID是否存在,即判断myjar有没有启动
     if [ -z "$PID" ]
    then
    #4,日志
        echo "Start the csms-admin directly "
    #5,myjar之前没有启动的话,这里直接调用start函数
        start
    else
    #6,myjar之前启动过且进程依然存活,则kill掉,然后调用start函数
        echo "kill the existing csms-admin process firstly."
        kill -9 $PID
        echo " $PID has been killed"
        start
    fi
    

2.前端

由于nginx部署在开发服务器(非jenkins所在服务器),所以前端部署都为远程部署

1.PC端远程部署
  1. 自由风格

    同上

  2. 丢弃旧的构建

    同上

  3. 源码管理

    同上

  4. 构建触发器

    同上

  5. 构建环境

    在这里插入图片描述

  6. 构建步骤

    在这里插入图片描述

    npm install
    rm -rf ${WORKSPACE}/dist
    npm run build:dev
    #本机部署则去掉下面的ssh步骤,这里加上下面的语句
    #rm -rf /data/csms/csms-web/html
    #mkdir -p /data/csms/csms-web/html
    #cp -rf ${WORKSPACE}/dist /data/csms/csms-web/html
    
  7. 增加Send files or execute commands over SSH 步骤

    在这里插入图片描述

    #!/bin/bash
    
    DIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev-pc'
    HTML_HOME='/data/csms/csms-web/test/html'
    
    #覆盖原来的dist
    cp -rf ${DIST_HOME}/dist/* ${HTML_HOME}/dist
    
2.移动端远程部署
  1. 构建步骤

    在这里插入图片描述

  2. ssh

    在这里插入图片描述

    #!/bin/bash
    
    DIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev'
    HTML_HOME='/data/csms/csms-app/test/html'
    
    #覆盖原来的dist
    cp -rf ${DIST_HOME}/mobiled_dist/* ${HTML_HOME}/mobiled_dist
    
  3. 其他步骤同PC

7.在jenkins上编写maven的setting文件

有的时候需要临时改下maven的setting文件,或者想编写多份setting文件给不同的构建任务去使用,可以在jenkins上直接进行配置

  1. 添加配置文件

    在这里插入图片描述

    PS:这里没有这个选项的,需要下载插件Jenkins 配置文件管理插件 Config File Provider_jenkins config file provider-CSDN博客

    在这里插入图片描述

    在这里插入图片描述

  2. 全局配置

    在这里插入图片描述

    在这里插入图片描述

  3. 到构建任务里配置

    在这里插入图片描述

    在这里插入图片描述

8.后端项目Dockerfile示例

本文的后端项目对应的Dockerfile,可参考使用,一般放在项目的根目录下

# 基础镜像
FROM openjdk:8-jre

# 维护者信息
MAINTAINER asus

ENV LANG=zh_CN.UTF8
ENV LC_ALL=zh_CN.UTF8

# 设置容器时区为当前时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone

# /tmp 目录作为容器数据卷目录,SpringBoot内嵌Tomcat容器默认使用/tmp作为工作目录,任何向 /tmp 中写入的信息不会记录进容器存储层
# 在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp

# 复制主机文件至镜像内,复制的目录需放置在 Dockerfile 文件同级目录下
ADD csms-admin/target/csms-admin-*.jar csms.jar

# 动态参数
ARG profileActive=dev
ENV profileActive ${profileActive}

ARG port=8881
ENV port ${port}

# 容器启动执行命令
ENTRYPOINT ["java", "-Xms256M","-Xmx1224M","-Xmn256M","-Xss256K","-Duser.timezone=GMT+8", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${profileActive}", "-jar", "/csms.jar"]

# 声明容器提供服务端口
EXPOSE ${port}

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

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

相关文章

qmt交易框架2.0版本----支持实时高频交易

经过了2个星期的开发,终于迎来了qm交易框架2.0,超过了3000行源代码,使用类开发,使用方便。 我们看看利用框架写一个简单的实时高频交易策略,很简单 源代码 from qmt_trader.qmt_trader import qmt_traderfrom qmt_tr…

工业 web4.0 的 UI 卓越非凡

工业 web4.0 的 UI 卓越非凡

求导,积分

求导公式: 复合函数求导法则:两个函数导函数的乘积. 例如:f(x)2x1,f(x)2,g(x)x^24x4,g(x)2x4 那么复合函数: g(f(x))(2x1)^24(2x1)4 把(2x1)看做整体,则g2(2x1)4 然后再求(2x1)的导函…

代码随想录算法训练营刷题复习1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习 一、01背包 416. 分割等和子集1049. 最后一块石头的重量 II494. 目标和474. 一和零 416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int i0;i<nums.size();i) {sumnums[i];}if(sum%2!0)retu…

Tuple 元组

文章目录 一、什么是元组 &#xff1f;二、元组的具体操作2.1 创建元组2.1.1 tuple() 创建元组函数和 list() 创建列表函数总结 2.2 元组的元素访问操作2.3 元组的元素计数操作2.4 zip 对象 一、什么是元组 &#xff1f; 列表属于可变序列,可以任意修改列表中的元素。 元组的…

JUC并发编程-第二天:线程池相关

线程池相关 线程池内置线程池的使用线程池的关闭excute方法和submit方法的区别 线程池 线程池就是一个可以复用线程的技术 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,Thread…

HTML静态网页成品作业(HTML+CSS)——游戏永劫无间网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

初见 Rollup 的十大常见问题

文章目录 初见 Rollup 的十大常见问题1. 超神奇的 Rollup 英文解释&#xff01;2. 为什么 ESM 要比 CommonJS 要好呢&#xff1f;3. 什么是 tree-shaking ?4. 如何使用 Rollup 处理 CommonJS&#xff1f;5. 为什么 node-resolve 不是一个内置功能&#xff1f;6. 为什么在进行代…

网络协议,OSI,简单通信,IP和mac地址

认识协议 1.讲故事 2004年&#xff0c;小明因为给他爹打电话&#xff08;座机&#xff09;费用太贵&#xff0c;所以约定一种信号&#xff0c;响一次是报平安&#xff0c;响两次是要钱&#xff0c;响三次才需要接通。 2.概念 协议&#xff1a;是一种约定&#xff0c;这种约…

如何实现电脑监视员工的电脑屏幕?六个方法偷偷分享给你

实现电脑监视员工的电脑屏幕&#xff0c;通常需要借助专业的监控软件或系统&#xff0c;这些工具旨在帮助企业管理者监督员工的工作状态&#xff0c;确保工作效率&#xff0c;同时保护公司资产和数据安全。以下是几种常见的实现方式。 1. 使用专业的远程监控软件 安企神软件&a…

kaggle竞赛实战10——特征优化

特征优化思路&#xff1a; 在完成常规流程后&#xff0c;如果不知道怎么办&#xff0c;可以针对文本or时间序列特征进行进一步处理 首先&#xff0c;我们注意到&#xff0c;每一笔信用卡的交易记录都有交易时间&#xff0c;而对于时间字段和文本字段&#xff0c;普通的批量创…

解决用Three.js实现嘴型和语音同步时只能播放部分部位的问题 Three.js同时渲染播放多个组件变形动画的方法

前言 参考这篇文章ThreeJSChatGPT 实现前端3D数字人AI互动&#xff0c;前面搭后端、训练模型组内小伙伴都没有什么问题&#xff0c;到前端的时候&#xff0c;脸部就出问题了。看我是怎么解决的。 好文章啊&#xff0c;可惜百度前几个都找不到&#xff0c;o(╥﹏╥)o 问题情况 …

【C++】环境搭建及基本工作流程

C 当你需要写性能良好的代码时&#xff0c;C仍是不二选择 如果你想访问硬件、如果你想对硬件进行控制&#xff0c;C仍是首选。 所有的游戏引擎都是用C编写的&#xff0c;因为C可以直接控制硬件。 原理&#xff1a; C代码-->编译器编译comple-->目标平台的机器码-->放…

[算法刷题—二分法]寻找插入位置

题目展示: 本道题本身并不是很难,主要是学习和分析二分查找插入位置的方法。 首先大体上分为两种情况: 一.target在待查找的数组之中,返回对应值的下标索引。 二.target不在待查找的数组之中&#xff0c;需要返回target插入位置的索引(原数组有序) 第一种情况不难&#xff…

视图-什么是(VIEW)?怎么创建(CREATE VIEW)?怎么删除(DROP)?怎么用(SELECT/INSERT/UPDATE/DELETE)?

一、引言 之前对数据库的操作都是针对基本关系表&#xff0c;操作都是在数据库的全局逻辑模式上进行的&#xff0c;而在实际的数据库系统中&#xff0c;可能用户只关心或只被允许使用数据库中的某些基本关系表或基本关系表中的某些属性列&#xff0c;这些数据构成了数据库的外…

基于SVD的点云配准(下)

点云配准及特征提取详细解读 本篇博客将介绍一个用于点云配准的 C++ 代码示例,该示例使用 PCL(Point Cloud Library)库来处理和配准两个点云数据集。我们将逐步解析代码的关键部分,并解释每个步骤的作用。 代码说明 代码的整体结构及其主要功能: int main(int argc, ch…

Vue 状态管理:从Vuex到Pinia,Vue 3官方推荐的状态管理库深度解析

大家好&#xff0c;我是前端宝哥。 在编程界有句老话&#xff1a;“命名和缓存失效是世上两大难题。” 我得说&#xff0c;在现代Web应用的状态管理上&#xff0c;这难题得排第三&#xff01; 今天&#xff0c;咱们来深挖一下Vue的状态管理之道&#xff0c;并介绍一个超直观的解…

汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片

前言: SerDes不是很常见,SerDes是将Ser和Des两种产品组合在一起的名称。Ser是Serializer或“并串转换器”的缩写,Des是Deserializer或“串并转换器”的简写。 Serdes是不是必须的?上一节介绍了camera,上上节也研究了video decoder,那么带摄像头的应用应该具体选哪个方案…

从踢足球到数字孪生

前言 贵州“村超”的火热现象是一个多方面因素共同作用的结果,它不仅是一场体育赛事,更是一个文化现象,反映了时代的精神和人民的情感诉求,同时也推动了乡村振兴和地区发展。足球的魅力是多方面的,它不仅仅是一项运动,更是一种全球性的文化现象。 简单规则下的无限变化:…

MySQL数据操作与查询- select 数据查询

一、select 选择列表 1、select基本结构 select 字段列表 from 表名 where 条件表达式 说明&#xff1a; &#xff08;1&#xff09; 必须的子句只有 select 子句和 from 子句。 &#xff08;2&#xff09;where 子句用于对查询结果进行过滤。 2、选择&#xff08;查询&am…