Java+Github+Jenkins部署

Java项目—Jenkins部署笔记

一,准备

  • 一台服务器
  • 操作系统,示例为ubuntu 22.0.4 可运行lsb_release -a查看

二,安装

  • docker

    • 更新软件包列表:
    sudo apt update
    
    1. 安装必要的软件包,以便使用HTTPS通过APT下载软件包:
    bashCopy code
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
    
    1. 添加Docker的官方GPG密钥:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    1. 添加Docker APT存储库:
    echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    1. 更新软件包列表以包括Docker存储库:
    sudo apt update
    
    1. 安装Docker引擎:
    sudo apt install -y docker-ce
    
    1. 启动Docker服务:
    sudo systemctl start docker
    
    1. 将Docker添加到启动时自动启动:
    sudo systemctl enable docker
    
    1. 验证Docker是否正确安装:
    sudo docker --version
    

    现在,Docker已经成功安装在您的Ubuntu系统上。您可以使用docker命令来管理和运行容器。

  • git

    • 打开终端:可以通过按下Ctrl + Alt + T 键组合,或者在应用程序搜索中找到“终端”。

    • 运行以下命令以更新软件包列表:

      sudo apt update
      
    • 安装Git:

      sudo apt install git
      
    • 安装完成后,可以通过运行以下命令来验证安装是否成功,并显示安装的Git版本:

      git --version
      

    现在,你已经成功在Ubuntu系统上安装了Git。你可以使用git命令来管理代码库、版本控制和其他Git操作。如果你还不熟悉Git的使用,可以查阅Git的文档或教程,以便更好地理解和利用其功能。

  • jdk

    • 自行下载,这里举例为 jdk-17_linux-x64_bin.tar.gz Java Downloads | Oracle 中国

    • sudo tar -zxvf  jdk-17_linux-x64_bin.tar.gz -C /usr/local
      
    • 然后就可以通过 "cd /usr/local"和“pwd”查看具体路径,以便后面配置,这里给出示例的路径:

    • /usr/local/jdk-17.0.8
      
  • maven

    • 自行下载,这里举例为 apache-maven-3.9.4-bin.tar.gz Maven – Download Apache Maven

    • sudo tar -zxvf  apache-maven-3.9.4-bin.tar.gz -C /usr/local
      
    • 然后就可以通过 "cd /usr/local"和“pwd”查看具体路径,以便后面配置,这里给出示例的路径:

    • /usr/local/apache-maven-3.9.4
      
  • jenkins

    • jenkins的安装可以在这个地址下载链接Jenkins download and deployment

    • 后台运行 Jenkins

      使用以下命令在后台运行 Jenkins:

      java -jar jenkins.war --httpPort=8080
      

      这将在 8080 端口启动 Jenkins。如果您希望使用不同的端口,请更改 --httpPort 参数的值。

    • 访问 Jenkins Web 界面

      在浏览器中输入 http://localhost:8080,然后按照 Jenkins 配置向导中的指示进行设置。在需要输入管理员密码时,请查找 Jenkins 日志中的初始密码,并在配置向导中使用它。

    • 将 Jenkins 配置为服务(可选)

      如果您希望将 Jenkins 配置为系统服务,以便在系统启动时自动运行,您可以创建一个 Systemd 服务单元。您可以创建一个名为 /etc/systemd/system/jenkins.service 的文件,并在其中添加以下内容:

      plaintextCopy code[Unit]
      Description=Jenkins Server
      After=network.target[Service]
      User=<your_username>
      ExecStart=/usr/bin/java -jar /path/to/jenkins.war --httpPort=8080
      Restart=always[Install]
      WantedBy=multi-user.target
      

      请将 <your_username> 替换为您的用户名,并将 /path/to/jenkins.war 替换为您实际下载的 Jenkins WAR 文件的路径。然后,使用以下命令启用和启动服务:

      bashCopy codesudo systemctl enable jenkins
      sudo systemctl start jenkins
      

三,Jenkins配置

1.基础插件安装

打开页面后会有一些基础的配置和插件的安装记得选默认的(因为,你也不知道需要什么插件,当然我也不知道),自行安装一下,如果要查看管理员密码的话,可以使用

cat命令+[页面提示的路径]

进入后,打开点击系统管理,在其中找到插件管理,在第二个选项中安装Docker相关的插件
在这里插入图片描述
这个是我已经安装的(OS:因为不知道哪个对应哪个,所以全点啦)
在这里插入图片描述
所有的插件安装完成后,继续回服务器中重启jenkins

sudo systemctl restart jenkins

2.全局工具配置

还是回到系统管理中,找到全局工具配置打开,看图配置吧,只要路径对就行了

  • Maven

在这里插入图片描述

  • JDK

在这里插入图片描述

  • Git
    在这里插入图片描述
    这些配置好后,保存退出,同样在系统管理中找到凭证管理
    进来后,直接点击到最后出现这界面即可
    在这里插入图片描述
    点击新增,选择如下
    在这里插入图片描述
    输入Github用户名和本地的私钥,大概在C:\Users\Administrator.ssh中的 id_rsa
    其他的描述可以输入:ssh key 这个随意,其他的不用输入,点击创建即可

然后再次新建一个凭证,选择
在这里插入图片描述
这里只需要输入Secret即可,这个值是Github的访问密钥,大概生成步骤为:

进入Github,点击头像,选择Settings,滑到最后选择Developer Settings,点击Personal access tokens下第一个直接生成,然后填写就行。

然后备注写成token,点击创建

好,现在凭证配置完毕,到时候需要用到的时候,可以来此查看。

接下来还是系统管理中点开系统配置,找到GitHub的位置,进行连接测试
在这里插入图片描述
这个名称就是你的GitHub的用户名,记得替换,凭证,选择token凭证,进行测试,如果不行,请重新配置token,或重新生成token (tnnd,这苦不能我一个受!)

好!很有精神!现在所有配置就完成了,到这里就可以新建一个Job来搭建部署了!

四,构建部署

好,到这里,就可以进行构建部署了,为了演示方便,我将使用下面的Java项目来当做示例:
ZhMenX的测试项目,可以下载下来调试一下。如果,我记得绑定了资源,可以查看下。

然后就是把这个项目放到你的github上面了
之后就是新建任务了
在这里插入图片描述
我们这里选择流水线(小声BB:目前只尝试过这个)命名为Test
在这里插入图片描述
这里就是配置的地方,选择Github项目的选项,然后输入自己的github项目地址
然后就是触发器的构建
在这里插入图片描述
这里我使用了轮询(我也想使用Github hook,但是不会,有会的大神,请教教我,我找不到那个jenkins的URL)

最后就是定义流水钱的脚本了,这里我提供一个示例:

pipeline {agent anytools {// 指定使用的JDK工具jdk 'jdk17'}environment {JDK_VERSION = '17'MAVEN_VERSION = '3.9.4'DOCKER_IMAGE_NAME = 'test_java'MAVEN_HOME = '/usr/local/apache-maven-3.9.4' // 设置Maven的路径DOCKER_HOME = '/usr/bin/docker' // 设置Docker的路径PATH = "${tool 'jdk17'}/bin:${MAVEN_HOME}/bin:${DOCKER_HOME}:${env.PATH}"}stages {stage('Checkout') {steps {// 检出代码库到工作目录checkout([$class: 'GitSCM',branches: [[name: '*/master']], // 指定主分支名称userRemoteConfigs: [[url: 'git@github.com:ZhMenX/Test.git', // GitHub仓库URL需要替换为自己的credentialsId: '' // 您的凭证ID 替换为自己的,这个就是ssh那个]]])}}stage('Build and Test') {steps {// 构建和测试Spring Boot项目sh 'mvn clean install'}}stage('Dockerize') {steps {script {def dockerImageTag = "${DOCKER_IMAGE_NAME}:${BUILD_NUMBER}"// 检查是否存在同名容器并停止def existingContainerId = sh(script: "docker ps -aq -f name=${DOCKER_IMAGE_NAME}", returnStdout: true).trim()if (existingContainerId) {echo "Stopping existing container: ${existingContainerId}"sh "docker stop ${existingContainerId}"}// 检查是否存在同名镜像def existingImageId = sh(script: "docker images -q ${DOCKER_IMAGE_NAME}", returnStdout: true).trim()if (existingImageId) {echo "Deleting existing image: ${existingImageId}"// 停止使用镜像的容器def runningContainers = sh(script: "docker ps -aq -f ancestor=${existingImageId}", returnStdout: true).trim()if (runningContainers) {sh "docker stop ${runningContainers}"}// 删除镜像sh "docker rmi -f ${existingImageId}"}sh "docker build -t ${dockerImageTag} ." // 构建 Docker 镜像sh "docker run -d -p 8090:8090 ${dockerImageTag}" // 运行 Docker 容器}}}}
}

最后补充一下:当需要修改端口时,测试项目中dockerfile和application.yml都需要修改,以及流水线脚本。

OK,到这里就完成了,当然,很大概是运行不成功的,哈哈哈哈哈哈哈哈,感受痛苦吧!

五,Bug扫荡

1,拉取代码失败

原因,主机密钥的配置问题2
解决方案:

ssh -T git@github.com
ssh-keyscan github.com >> ~/.ssh/known_hosts

2,docker权限问题

当前用户没有docker权限,这个不管事的话,只能试试重启大法了

sudo usermod -aG docker $USER

作为经历过docker 权限错误洗礼的我来说,我也没啥其他办法,擦…

六,我的问题(球球了)

  1. 我有尝试过把jenkins当容器来运行也就是DinD,比如docker run -d --name jenkins-dind --privileged --user root -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts,但是这样并不能解决jenkins执行docker在脚本中执行docker run等命令,提示docker:not found的问题
  2. 我尝试过实现提交代码到远程库就触发构建的操作,但是在配置hook的时候,找不到jenkins的hook地址,点击那个选项GitHub hook trigger for GITScm polling不会弹出,hook的连接,是需要其他的插件来实现嘛,求指教

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

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

相关文章

leetcode 1326. Minimum Number of Taps to Open to Water a Garden

x轴上的花园范围为[0,n], 0~n这个n1个离散点上有水龙头&#xff0c;第 i 个水龙头能浇水的范围为[i-ranges[i], iranges[i]]. 求能浇整个花园的最小水龙头个数。 思路&#xff1a; 方法一&#xff1a; greedy 先把每个水龙头能浇的区间准备好&#xff0c; 用一个数组保存所有…

Glide分析和总结

1. Glide概述 Glide是一款图片处理的框架&#xff0c;从框架设计的角度出发&#xff0c;最基本要实现的就是 加载图片 和 展示。 它把一个图片请求封装成一个Request对象&#xff0c;里面有开启、暂停、关闭、清除网络请求、以及载体生命周期的监听等操作。然后通过RequestBu…

语言模型(language model)

文章目录 引言1. 什么是语言模型2. 语言模型的主要用途2.1 言模型-语音识别2.2 语言模型-手写识别2.3 语言模型-输入法 3. 语言模型的分类4. N-gram语言模型4.1 N-gram语言模型-平滑方法4.2 ngram代码4.3 语言模型的评价指标4.4 两类语言模型的对比 5. 神经网络语言模型6. 语言…

云计算环境中高性能计算的挑战与对策

文章目录 云计算中的高性能计算挑战1. 资源竞争&#xff1a;2. 网络延迟&#xff1a;3. 数据传输效率&#xff1a;4. 虚拟化开销&#xff1a;5. 节点异构性&#xff1a; 高性能计算在云计算环境中的对策1. 定制化虚拟机镜像&#xff1a;2. 弹性资源调整&#xff1a;3. 高效数据…

Java 包装类和Arrays类(详细解释)

目录 包装类 作用介绍 包装类的特有功能 Arrays类 Arrays.fill() Arrays.toString() Arrays.sort() 升序排序 降序排序 Arrays.equals() Arrays.copyOf() Arrays.binarySearch() 包装类 作用介绍 包装类其实就是8种基本数据类型对应的引用类型。 基本数据类型引用…

C盘扩容遇到的问题(BitLocker解密、)

120G的C盘不知不觉的就满了&#xff0c;忍了好久终于要动手了。 尽管电脑-管理--磁盘管理里可以进行磁盘大小调整&#xff0c;但由于各盘都在用&#xff0c;不能够连续调整&#xff0c;所以选用DiskGenius。 # DiskGenius调整分区大小遇到“您选择的分区不支持无损调整容量” …

tcpdump

TCPDump是一个用于抓取网络数据包的命令行工具。它可以帮助网络管理员和开发人员分析网络流量、故障排除以及安全问题。下面是一些TCPDump的详细用法&#xff1a; 基本用法&#xff1a; 监听指定网络接口&#xff1a;tcpdump -i eth0通过IP地址过滤&#xff1a;tcpdump host 19…

常见的 HTML<meta> 标签的 name 属性及其作用

HTML中的 <meta> 标签可以通过 name 属性提供元数据&#xff0c;这些元数据可以用于指定有关文档的信息&#xff0c;以及控制浏览器和搜索引擎的行为。name 属性通常与其他属性一起使用&#xff0c;如 content、charset、http-equiv 等&#xff0c;以提供更具体的元数据信…

网络基础之重中之重

目录 IP协议 ​编辑 基本概念&#xff1a; 协议头格式&#xff1a; ​编辑 网段划分 DHCP &#xff1a; CIDR&#xff1a; 特殊的IP地址&#xff1a; IP地址的数量限制&#xff1a; 私有IP和公网IP 路由 路由的过程&#xff1a; 数据链路层 认识以太网&#x…

C# Dapper 操作Oracle数据库

nuget安装内容 1.配置连接字符串 OracleConnectionString这个可用 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","…

算法面试-深度学习基础面试题整理-AIGC相关(2023.9.01开始,持续更新...)

1、stable diffusion和GAN哪个好&#xff1f;为什么 &#xff1f; Stable diffusion是一种基于随机微分方程的生成方法&#xff0c;它通过逐步增加噪声来扰动原始图像&#xff0c;直到完全随机化。然后&#xff0c;它通过逐步减少噪声来恢复图像&#xff0c;同时使用一个神经网…

算法通关村——海量数据场景下的热门算法题的处理方法

1. 从40个亿中产生一个不存在的整数 题目要求&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你有1GB的内存来完成这项任务。 ● 进阶&#xff1a;如果只有10MB的内存可用&a…

【Python小工具】解决Python的Pyinstaller将.py文件打包成.exe可执行文件后文件过大的问题

文章目录 前言1. 创建新项目![请添加图片描述](https://img-blog.csdnimg.cn/36dcadc85d864a08b93af78b9e79ff6d.jpeg)2.删除原项目中的全部文件3.将要打包的文件放入该项目目录下4.创建虚拟环境5.设置解释器为虚拟环境中的python解释器6.查看是否成功使用虚拟环境中的python解…

【Spring Security】UserDetailsService 接口介绍

文章目录 UserDetailsService 介绍UserDetailsService 具体操作UserDetailsService 方法介绍 UserDetailsService 介绍 UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。大白话就是你写一个实现类实现 UserDetailsServic…

mysql异常占用资源排查

通过执行日志与连接信息排查 查看是否开启日志记录 mysql> show global variables like %general%; --------------------------------- | Variable_name | Value | --------------------------------- | general_log | OFF | | general_log_file…

Citespace、vosviewer、R语言的文献计量学 、SCI

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

API接口接入电商平台案例,根据关键词获取拼多多商品列表示例

item_search-根据关键词取商品列表 公共参数 请求地址: 注册调用key 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_g…

uniapp 布局(自定义导航栏加固定高度的主要内容)

不想让整体页面出现滚动条 页面大致分为三部分&#xff0c;导航栏、主题内容、tabbar&#xff0c;不想让整个页面出现滚动条&#xff0c;只想让主要内容滚动。 我这里是直接用了uni.getSystemInfoSync()&#xff0c;整体分为两部分&#xff0c;自定义头部和滚动内容&#xff…

微信小程序echart导出图片

echarts版本5.1.0 用到的echarts组件是uni插件市场的echart组件 <div style"overflow: hidden;"><dCanvas class"uni-ec-canvass" id"uni-ec-canvas" ref"canvas" canvas-id"mychart-gauge" :ec"ec"&g…

SCOPE_IDENTITY什么意思

在关系型数据库中&#xff0c;SCOPE_IDENTITY()是一个用于获取最近插入的行的自增标识列值的函数。当向数据库表中插入一行数据时&#xff0c;如果表中的某列被配置为自增标识列&#xff08;通常是主键列&#xff09;&#xff0c;数据库会自动为每个插入的行分配一个唯一的值&a…