gitlab+jenkins+docker持续集成环境搭建实战

news2025/1/17 15:29:33

介绍

在这里插入图片描述

什么是持续集成?

持续集成(CI)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。持续集成是启动管道的环节(尽管某些预验证 —— 通常称为 上线前检查(pre-flight checks) —— 有时会被归在持续集成之前)。

本篇简明扼要,直击痛点,可以让急需构建CI/DI环境而无从下手的小伙伴。
在这里插入图片描述

步骤

准备服务器

4台centos7虚拟机:
192.168.182.131 gitlab服务器
192.168.182.132 jenkins服务器
192.168.182.133 java应用发布服务器
192.168.182.134 docker发布服务器

可以先搭建1台基础的包含dockerjdk环境的虚拟机。其余的3台采用克隆方式创建。

准备1个springboot项目

主要用于演示代码提交和自动化构建,代码很简单:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> 
    </parent>

    <groupId>com.test.java</groupId>
    <artifactId>helloci</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 跳过测试 -->
        <skipTests>true</skipTests>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--打包-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
@RestController
public class HelloController {
    @GetMapping
    public String hello(){
        return "hello ci/cd test docker auto build using pipeline";
    }
}

搭建docker环境

  • centos7如何安装docker请参考:
    https://blog.csdn.net/IndexMan/article/details/128495994

搭建gitlab环境

docker方式启动gitlab

请参考:
https://blog.csdn.net/IndexMan/article/details/103319871

rpm方式安装

  • 下载rpm
    https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/选一个版本
  • 安装
rpm -ivh gitlab-ce-15.7.0-ce.0.el7.x86_64.rpm

在这里插入图片描述

  • 修改external_url配置
    改成自己的ip,端口自定义。
vim  /etc/gitlab/gitlab.rb

在这里插入图片描述

  • 启动
gitlab-ctl reconfigure
gitlab-ctl restart

在这里插入图片描述

  • 访问系统http://192.168.182.131:8009/
    注意:我安装的是gitlab15,root用户默认密码存储在一个配置文件中,这个文件在安装24小时后自动删除!
    在这里插入图片描述
cat /etc/gitlab/initial_root_password

在这里插入图片描述

  • 修改管理员密码
    在这里插入图片描述

搭建jenkins环境

安装jdk11

https://www.oracle.com/java/technologies/downloads/#java11

  • 安装
rpm -ivh jdk-11.0.17_linux-x64_bin.rpm
java -version

运行jenkins

  • 下载
    注意:我下载的是最新版本,需要安装jdk11才能运行。
    https://get.jenkins.io/war-stable/2.375.1/jenkins.war
  • 运行
java -jar jenkins.war

记下密码。
在这里插入图片描述

  • 访问http://192.168.182.132:8080/
    填入管理员密码。
    在这里插入图片描述
  • 解决jenkins离线提示
    在这里插入图片描述
    修改配置文件:
vim /root/.jenkins/hudson.model.UpdateCenter.xml

将其中的地址改为国内可访问地址,
在这里插入图片描述
然后重启再次访问:
在这里插入图片描述
在这里插入图片描述
注意:这一步先停一下,因为jenkins官方插件安装地址是国外的,这个地方我们要换成国内的。去修改配置文件:

# 修改default.json
cd /root/.jenkins/updates
sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json && sed -i 's#www.google.com#www.baidu.com#g' default.json
  • 然后继续安装推荐插件,最后设置管理员账号密码后进入系统首页
    在这里插入图片描述

安装插件

mavensshauth插件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

配置maven

  • 官网下载解压到/usr/local/maven
  • 配置环境变量
# 配置Maven环境变量
vi /etc/profile

# 在配置文件末尾加上maven路径
# maven
export MAVEN_HOME=/soft/apache-maven-3.8.6
export PATH=$PATH:$MAVEN_HOME/bin

# 使配置文件立即生效
source /etc/profile
  • 配置阿里云仓库
<mirror>
  <id>alimaven</id>
  <mirrorOf>central</mirrorOf>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

安装git

yum install git

构建maven任务

在这里插入图片描述

  • 添加之前新建好的git项目地址在这里插入图片描述
  • 开始构建
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

构建后发送到测试服务器

在这里插入图片描述

  • 修改maven任务配置
    添加构建后动作:
    在这里插入图片描述
    在这里插入图片描述
  • 执行构建
  • 到测试服务器查看应用已经在后台运行
    在这里插入图片描述

解决publisher超时

将构建后执行的命令修改一下:

nohup java -jar /home/helloci/helloci-1.0-SNAPSHOT.jar > /tmp/helloci.log 2>&1 &

构建前置清理脚本

在133服务器 /home/helloci目录下新建脚本clear.sh

#!/bin/bash

rm -f helloci*.jar
appname=$1
echo "arg:$1"
# get pid
pid=`ps -ef | grep $1 |grep 'java -jar' | awk '{printf $2}'`
echo $pid

if [ -z $pid ]
then
  echo "$appname not start"
else  
  kill -9 $pid
fi

在这里插入图片描述

配置钩子实现自动构建

在这里插入图片描述
浏览器输入以下地址测试:
http://192.168.182.132:8080/buildByToken/build?job=helloci&token=123123

发现可以自动触发构建。

  • 在gitlab工程中配置
    先解除配置本地URL的限制!
    在这里插入图片描述
    在工程上配置webhook

在这里插入图片描述
在这里插入图片描述

  • 测试,再次提交代码
    发现jenkins触发了自动构建:
    在这里插入图片描述
    在这里插入图片描述

自动化构建docker镜像

手工构建测试

准备一台docker环境服务器:192.168.182.134
将之前打包好的helloci.jar上传到/home目录,并创建一个Dockerfile文件:

FROM openjdk:8
EXPOSE 9001
WORKDIR /root
COPY *.jar /root/app.jar
ENTRYPOINT ["java","-jar","/root/app.jar"]
  • 执行构建命令
docker build -t helloci .

在这里插入图片描述

  • 解决WARNING: IPv4 forwarding is disabled. Networking will not work
echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
systemctl restart network && systemctl restart docker
  • 运行镜像
docker run -d -p 9001:9001 --name helloci helloci:latest

访问到9001地址,说明构建没问题。

自动化构建

  • 创建新jenkins任务helloci-docker
  • 配置pre steps
    在这里插入图片描述
  • 配置传输文件动作
    将打包好的jar文件和工程根目录下的Dockerfile传输到134服务器的/home路径下。
    在这里插入图片描述
    在这里插入图片描述
  • 执行构建
    查看134服务器上相关构建结果
    在这里插入图片描述

使用pipeline构建

使用blue ocean ui

在这里插入图片描述

  • 创建1个测试pipeline item
    在这里插入图片描述
pipeline {
    agent any

    stages {
        stage('pull code') {
            steps {
                echo 'pull success.'
            }
        }
        stage('exec build') {
            steps {
                echo 'build success.'
            }
        }
    }
}

在这里插入图片描述

自动打包docker镜像

  • 创建1个新的pipeline item pipeline-docker
  • 利用片段生成器,生成git拉取代码脚本、发送文件、执行远程服务器命令脚本,填入到流水线 脚本中:
    在这里插入图片描述
    具体脚本如下
pipeline {
    agent any
    
    tools {
        maven "maven3"
    }

    stages {
        stage('拉取代码') {
            steps {
                git branch: 'main', credentialsId: 'gitlab', url: 'http://192.168.182.131:8009/root/helloci.git'
                echo 'pull success.'
            }
        }
        stage('构建jar包') {
            steps {
                // sh "mvn --version"
                sh """
                    mvn clean package
                   """
                echo 'build success.'
            }
        }
        stage('清理应用服务器'){
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: '134dockerserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home
rm -rf *
docker stop helloci
docker rm helloci
docker rmi helloci''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            echo 'clear success'
            }
        }
        stage('发送文件') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: '134dockerserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: '**/helloci*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home
docker build -t helloci .
docker run -d -p 9001:9001 --name helloci helloci:latest''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**/Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo 'build success.'
            }
        }
    }
}
  • 执行构建,后访问发现镜像已更新,配置成功!
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

2023 数据结构复习

函数编程题 7-1 交换二叉树中每个结点的左孩子和右孩子 #include<stdio.h> #include<stdlib.h> typedef struct Node {char data;struct Node *left, *right; } Node, *Tree;Tree create() {char ch;Tree tree NULL;if (scanf("%c", &ch)) {//当有…

P5015 [NOIP2018 普及组] 标题统计————C++

题目 [NOIP2018 普及组] 标题统计 题目描述 凯凯刚写了一篇美妙的作文&#xff0c;请问这篇作文的标题中有多少个字符&#xff1f; 注意&#xff1a;标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时&#xff0c;空格和换行符不计算在内。 输入…

JAVA开发与架构(携程架构实践)

发这篇博文主要是想学习一下携程的架构。携程出了一本《携程架构实践》&#xff0c;无奈现在还没开源。看京东价大概109元人民币。如果看到次博文的网友能发我一本《携程架构实践》pdf。不胜感谢。或者实体书籍也行。其实我不怎么需要实体书籍&#xff0c;因为技术的东西很快会…

特种变色树脂T-46 CC

Tulsimer T-46 CC ISO-9001/ISO-14001/OHSAS-18000 特级强酸性阳离子交换树脂--(自变色树脂) Tulsimer T-46 CC 是一款专门研制的、优质的、强酸型的聚苯乙烯架构的阳离子交 换树脂&#xff0c;具有核子级磺酸官能团&#xff0c; 并同时拥有绝佳的物理及化学稳定品质&#x…

three.js 之 入门篇1

目录three.js 之 入门篇1&#xff1a;使用parcel搭建 three.js 开发环境2&#xff1a;运行一个简单的场景和物体2.1 main.js2.2效果3&#xff1a;轨道控制器和控制物体 mesh3.1 main.js3.2效果4&#xff1a;添加坐标辅助器 AxesHelper4.14.2效果5&#xff1a;设置几何体移动5.1…

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别 文章目录深度学习 Day24——使用Pytorch环境实现mnist手写数字识别一、前言二、我的环境三、Pytorch简介四、前期工作1、导入依赖项和设置GPU2、导入数据3、加载数据4、数据可视化五、构建简单的CNN网络六、训练模型1、…

Spring的嵌套事务(Propagation.NESTED)到底是个啥

什么是嵌套事务 嵌套事务其实是对数据库SavePoint概念的Java操作版封装&#xff0c;什么是SavePoint参考我另一篇blog&#xff1a;juejin.cn/post/718544… SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样…

Java图形化界面---AWT布局管理器

目录 一、布局管理器介绍 二、布局管理器用法 &#xff08;1&#xff09;FlowLayout &#xff08;2&#xff09;BorderLayout &#xff08;3&#xff09;GridLayout &#xff08;4&#xff09;CardLayout &#xff08;5&#xff09;BoxLayout 三、Box容器的讲解 一、布…

自主实现HTTP

"让我们&#xff0c;跳吧在无比宏达的星系!" 一、背景 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么…

STL list容器底层代码剖析、正向迭代器与反向迭代器的类的封装

目录 一、迭代器是什么 二、迭代器的本质 三、如何给一个容器实现迭代器功能 四、正向迭代器功能的具体实现 五、反向迭代器 六、list底层代码剖析 一、迭代器是什么 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设…

【手写 Vue2.x 源码】第六篇 - 数据代理的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;数组类型的数据劫持是如何实现的&#xff0c;核心思路如下&#xff1a; 出于对性能的考虑&#xff0c;Vue 没有对数组采用 Object.defineProperty 进行递归劫持&#xff0c;而是对能够导致原…

NOSQL数据库习题

NOSQL数据库习题第一章第二章第三章第四章第五章NoSQL数据库上机测试第一章 1.写出DB、RDB、DBMS、TRDB、NoSQL、NewSQL、NDFS的中文名称。 答&#xff1a;DB&#xff1a;数据库 RDB&#xff1a;关系型数据库 DBMS&#xff1a;数据库管理系统 TRDB&#xff1a;传统关系型数据…

解决Shotgrid登陆不上, 上传出错,窗口卡住不动等问题

在使用Shotgrid时&#xff0c;是否遇到这种问题&#xff1a; accounts.autodesk.com出错 auth.autodesk.com出错 再或者这样出错&#xff1a; Shotgrid登陆出错 再再这样关闭Load…时这样出错&#xff0c; 窗口半天都关闭不了&#xff1a; 分析&#xff1a; 1 出现这种错…

(一分钟)激光SLAM扫描匹配 文献阅读

本博客介绍了激光SLAM扫描匹配的相关问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;扫描匹配也是数据关联类的问题&#xff0c;是SLAM里面的重要构成部分。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

PyTorch实例2——文本情绪分类器

实例主要用于熟悉相关模型&#xff0c;并且练习创建一个模型的步骤&#xff1a;数据收集、数据预处理、构建模型、训练模型、测试模型、观察模型表现、保存模型传送门&#xff1a;蓝桥云课实验 目录1. 实验环境2. 实验目的3. 相关原理4. 实验步骤4.1 数据收集从在线商城抓取评论…

OpenHarmony 标准系统HDF框架之I2C驱动开发

OpenHarmony 标准系统HDF框架之I2C驱动开发主要内容I2C 基础知识## I2C 基础知识 —— 概念和特性I2C 基础知识 —— 协议、四种信号组合I2C 调试手段## I2C 调试手段 —— 硬件I2C 调试手段 —— 软件HDF 框架下的 I2C 设备驱动## HDF 框架下的 I2C 设备驱动 —— 案例描述HDF…

Shell 传递参数

我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推……实例以下实例我们向脚本传递三个参数&#xff…

ArcGIS Pro脚本工具(15)——按字段属性值分类导图

之前做了配合地图系列批量导图的脚本工具 ArcGIS Pro脚本工具&#xff08;9&#xff09;——配合地图系列批量导图_学学GIS的博客-CSDN博客_arcgispro批量导出地图pngPro的地图系列是批量制图的利器&#xff0c;但是有个不便的地方&#xff0c;就是设置完成地图系列后&#xf…

机器学习实战教程(13篇)

机器学习实战教程(13篇)这些网址非常适合想学习机器学习&#xff0c;却苦于没有项目&#xff08;尤其缺少数据&#xff09;的人。无意中看到&#xff0c;给自己做一个记录。机器学习实战教程&#xff08;一&#xff09;&#xff1a;K-近邻算法&#xff08;史诗级干货长文&#…

2022年度外设产品行业增长分析:鼠标、键盘同比增长27%

近年来&#xff0c;信息技术迅速发展&#xff0c;网民数量不断增长&#xff0c;深刻改变着社会的运作方式&#xff0c;对社会生产、商业运作模式等方面产生重大影响。广泛的行业应用为网络设备品牌商、制造商带来了差异化的细分市场&#xff0c;各类互联网设备接入数量也快速增…