Fastapi项目通过Jenkins2.4.91自动化构建部署到Nginx1.20进行访问详细方法(完全自动化部署亲测可用)

这篇技术文章需要结合我写的前两篇文章来一起看
Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用) 和 Pycharm2024.3+Gitlab.17.7本地化部署和自动提交代码使用方法(亲测可用),总体来说是三部曲。这篇文章详细解读了,真正完全自动化部署的闭环。下面详细介绍,内容如下:

一、安装你的nginx(这里不进行描述,可以用命令安装也可以采用Docker或者Podman方式进行安装)

二、Jenkins配置

(1)在Jenkins里安装ssh插件:

打开Jenkins选择系统管理,再选择插件管理在左侧菜单选择Available plugins,在右侧搜索框中输入SSH,选上SSH插件后,点击按钮按钮进行安装。

此时出现这个页面需要把安装完成后重启Jenkins(空闲时)这个选上。
 

(如果你的Jenkins没有自动重启请刷新页面)

(2)同样的方法在Jenkins里安装SSH Agent插件并重启Jenkins:

2、配置git环境

进入jenkins后进入系统管理,在进入全局工具配置给git起个名字,然后把Linux下的git安装目录复制到这里,然后点击自动安装,最后点击应用和保存按钮
 

3、在jenkins里的系统管理里找到凭据进入后要配置3个凭据(这里我已经建立完成,下面是具体操作步骤)


(1)第一个凭据:是在上面的图片里点击System后,点击里面的全局凭证,在点击AddCredentials按钮进行添加(这里填写gitlab的账号密码,用处是在脚本里)
 

(2)第二个凭据:
点击jenkins首页,点击系统管理,点击系统配置,找到gitlab后,从上至下填写名称、gitlab地址和凭据,这里的凭据点击添加,选择jenkins后,在类型里选择GitLab API token。(这个凭据的用处是在系统管理里的系统配置里的GitLab里进行配置)

(这里添加的信息是在gitlab里的偏好设置里添加令牌,直接把里的key复制到里面。然后选择到期时间和选择范围。最后点击创建个人访问令牌。)

创建成功后点击复制令牌key按钮。

此时回到Jenkins设置GitLab页面点击Credentials里的添加按钮

把刚才复制的key粘贴到API token里,然后选择添加按钮

然后再点击 Test Connection进行检测是否能链接上gitlab。如果错误将提示:Client error: HTTP 401 Unauthorized。
如果正确则显示Success。

(3)第三个凭据:这个凭据是设置SSH的。目的是为了在部署的脚本里进行通信。方法跟第一个凭据添加的步骤是一样的。都是在系统管理点击凭据页面里点击Stores scoped to Jenkins下面的System页面里的全局凭据后点击Add Credentials按钮进行添加全局凭据。(这个凭据的作用是链接Linux服务器)

点击后在类型这里选择SSH Username with private key,添加你的ID,选择Private Key后。这里的Username和key是需要你在linux里通过git生成Jenkins的公钥和私钥(公钥私钥都不要加密码),

在linux下创建公钥私钥方法:

ssh-keygen -t rsa -C "aabbcc@hotmail.com"

Generating public/private dsa key pair.

Enter file in which to save the key (/home/username/.ssh/id_dsa): 这里直接回车

Enter passphrase (empty for no passphrase): 这里直接回车

Enter same passphrase again: 这里直接回车

Your identification has been saved in /home/username/.ssh/id_dsa.

Your public key has been saved in /home/username/.ssh/id_dsa.pub.

The key fingerprint is:

SHA256:cO9y80L9EMCueury+RceGX/nGyZzaGsDlXztOFu+8ac aabbcc@hotmail.com

(创建步骤在《pycharm+gitlab提交版本和文件方法》一文里面有)然后把私钥复制到key里。

然后在.ssh目录下把生成的.pub公钥文件里的信息复制在.ssh目录下的authorized_keys文件中,如果没有创建这个文件,把不带.pub的私钥文件里的信息复制到Private Key当中,然后点击Create按钮。

(创建authorized_keys文件命令:touch authorized_keys,一定要在.ssh目录下进行创建)

4、在 Jenkins Job 中配置 GitLab 仓库 URL 和凭据

为了让Jenkins自动把代码打包到特定目录区域并实现每次打包后自动在Nginx上运行要在你的项目中写一个shell脚本文件,命名为start_uvicorn.sh

#!/bin/bash# 端口号
PORT=8080# 输出正在操作的端口
echo "Current deploy port: ${PORT}"# 使用 printf 格式化字符串
echo "Killing uvicorn process on port ${PORT}..."
pgrep -f "$(printf 'uvicorn.*--port %s' "$PORT")" | xargs -r kill -9 || echo "No uvicorn process found on port ${PORT}"# 启动新的 uvicorn 进程
echo "Starting uvicorn on port ${PORT}..."
nohup uvicorn main:app --host 0.0.0.0 --port ${PORT} > uvicorn.log 2>&1 &# 输出启动信息
echo "uvicorn has been started on port ${PORT}. Check 'uvicorn.log' for output."

(注:然后jenkins的 脚本会自动运行这个脚本, 以防止在jenkins里面启动的进程会随着jenkins脚本结束而结束.这个脚本会用下面的先清除 8080 端口下 已在运行的 uvicorn 进程 ,然后启动自己的进程)

选择您的任务,选择配置,在Configure页面里的最下面找到流水线定义这里选择Pipeline script后,把你的Jenkins脚本复制到里面,选择使用Groovy沙盒,最后选择保存和应用

在项目里的脚本内容如下(需要改成你自己的相关地址、端口号和参数等其他配置项):

pipeline {agent anyenvironment {// 配置你的项目打包地址DEPLOY_DIR = '/home/Projects'// 配置你的项目打包服务器的IP地址REMOTE_SERVER = '192.168.80.132'// 生产环境强烈建议使用非 root 用户REMOTE_USER = 'root' // 配置你的Jenkins的SSH的IDSSH_KEY_CREDENTIALS = 'SSH_key'}triggers { gitlab(triggerOnPush: true) }stages {stage('Prepare Environment') {steps {script {// 在 Jenkins 服务器上安装 rsync(如果需要)sh """dnf install -y rsync || apt-get update && apt-get install -y rsync"""sshagent([env.SSH_KEY_CREDENTIALS]) {// 在远程服务器上安装 Python 和 pip(如果需要)sh "ssh ${REMOTE_USER}@${REMOTE_SERVER} 'sudo dnf install -y python3 python3-pip'"}}}}stage('Checkout') {steps {git credentialsId: '21e85f84-ea3b-4850-bd2c-ebb29ca7bf3a', url: 'http://192.168.80.132:1506/root/fastapi_stydy.git'}}stage('Clean Old Files') {steps {sshagent([env.SSH_KEY_CREDENTIALS]) {sh "ssh ${REMOTE_USER}@${REMOTE_SERVER} 'rm -rf ${DEPLOY_DIR}/*'"}}}stage('Copy Files to Remote Server') {steps {sshagent([env.SSH_KEY_CREDENTIALS]) {sh """ssh ${REMOTE_USER}@${REMOTE_SERVER} 'mkdir -p ${DEPLOY_DIR}'rsync -avzz --delete --exclude .git ${WORKSPACE}/ ${REMOTE_USER}@${REMOTE_SERVER}:${DEPLOY_DIR}"""}}}stage('Install Dependencies') {steps {sshagent([env.SSH_KEY_CREDENTIALS]) {sh "ssh ${REMOTE_USER}@${REMOTE_SERVER} 'cd ${DEPLOY_DIR} && pip install -r requirements.txt'"}}}stage('Kill Existing Processes') {steps {sshagent([env.SSH_KEY_CREDENTIALS]) {script {try {sh "ssh ${REMOTE_USER}@${REMOTE_SERVER} 'pgrep -f \"uvicorn.*${DEPLOY_DIR}\" | xargs -r kill -9 || true'"} catch (Exception e) {echo "Warning: Failed to kill existing uvicorn processes. Continuing deployment..."println e}}}}}stage('Deploy and Start Application') {steps {sshagent([env.SSH_KEY_CREDENTIALS]) {sh "ssh ${REMOTE_USER}@${REMOTE_SERVER} 'chmod +x ${DEPLOY_DIR}/start_uvicorn.sh && cd ${DEPLOY_DIR} && nohup ./start_uvicorn.sh &'"}}}}
}

点击应用和save按钮,之后点击立即构建或从你的IDE编辑器重新提交代码。(注:我上面的脚本直接把项目自动构建到Nginx里。否则不能直接访问。)

5、配置Nginx使其项目或板块进行访问
(1)配置Nginx找到你nginx的目录里的default.conf文件

里面更改成下面的代码

server {listen       80;listen  [::]:80;server_name  192.168.80.132;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html;  # 静态文件的根目录index  index.html index.htm;  # 默认首页}# 代理 API 请求到后端服务器location /api/ {proxy_pass http://192.168.80.132:8080/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}#配置错误页面error_page 404 /custom_404.html;error_page 500 /custom_500.html;error_page 502 /custom_502.html;error_page 503 /custom_503.html;error_page 504 /custom_504.html;location = /custom_404.html {root /usr/share/nginx/html;internal;}location = /custom_500.html {root /usr/share/nginx/html;internal;}location = /custom_502.html {root /usr/share/nginx/html;internal;}location = /custom_503.html {root /usr/share/nginx/html;internal;}location = /custom_504.html {root /usr/share/nginx/html;internal;}
}# 压缩配置gzip on;gzip_types text/plain application/json application/javascript text/css application/xml;gzip_min_length 1024;gzip_proxied any;gzip_vary on;

每次保存后必须重启nginx。然后找到你打包项目的前端代码放入/usr/share/nginx/html目录里。(前端代码和后端代码必须分离,是两个目录。)


6、启动后端服务:
通过在linux里通过命令启动后端服务器:uvicorn main:app --host 192.168.80.132 --port 8080(必须在你的main文件的目录下输入此运行命令)

7、访问:

浏览器里输入前端地址:http://192.168.80.132:1510/api/index,下面是效果

浏览器里输入后端地址:http://192.168.80.132:8080/docs#/default/index_index_get ,下面是效果

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

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

相关文章

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和…

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 搜索系列相关文章(置顶) 1.原始信息再加工:一文读懂倒排索引 2.慧眼识词:解析TF-IDF工作原理 3.超越TF-IDF:信息检索之BM25 4.深入浅出 Beam Search:自然语言处理中的高效搜索利器 1…

二、CSS基础

一、选择器(1) 大白话:我们人为认为的解析方式是,从左往右查找,对于浏览器来说,是从右往左查找,解析速度更高。 注: 伪类选择器 - 作用于实际存在的元素,用于描述元素的某种特定状态或关系&…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信,但当我通过USB将手机连接到电脑时,我在电脑上找不到它们。由于我的手机内存已达到限制,并且我想保留短信的纸质版本,您能帮我将短信从摩托罗拉手机导出到计算机吗? 如您所知&…

Linux终端输入删除键backspace显示^H,输入上下左右键显示^A^B^C^D原理以及详细解决办法!

当我们装完Linux系统之后,我们可能会碰到按下删除键后出现^H这种情况。 同样,输入上下左右键显示^A^B^C^D这种情况。 这是为什么呢? 别急,后面我会说具体解决办法,先来看看这是为什么? 一、终端程序架构 首先,我们需要了解终端程序架构。 终端程序架构分为三层,分别…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S?关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频?位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中,尤其是社交媒体和内容平台,展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构,轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评,并列出完整的实现代码。 2、需求分…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件,它主要用于在开发过程中提供智能的代码延续功能。例如,当你在编写代码并且需要进行下一步操作或者完成一个代码块时,它能够根据代码的上下文、语法规则以及相关的库和框架知识,为你提供可能的代码续…

kafka开机自启失败问题处理

前言:在当今大数据处理领域,Kafka 作为一款高性能、分布式的消息队列系统,发挥着举足轻重的作用。无论是海量数据的实时传输,还是复杂系统间的解耦通信,Kafka 都能轻松应对。然而,在实际部署和运维 Kafka 的…

Linux Red Hat 7.9 Server安装GitLab

1、关闭防火墙 执行 systemctl disable firewalld 查看服务器状态 systemctl status firewalld 2、禁用selinux vi /etc/selinux/config 将SELINUX 的值改为 disabled 3、安装policycoreutils-python 执行 yum install policycoreutils-python 4、下载gitlab wget --co…

PostgreSQL对称between比较运算

本文介绍PostgreSQL对称between比较功能:between symmetric,在动态拼接SQL时利用它可以简化判断。PostgreSQL 9.4 及以上版本支持BETWEEN SYMMETRIC操作符,MySQL、Oracle、MsSQL没有对应功能。 between 比较 PostgreSQL的between结构允许你对…

[CTF/网络安全] 攻防世界 simple_php 解题详析

题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 代码解读 $a$_GET[a]; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b$_GET[b];…

日志聚类算法 Drain 的实践与改良

在现实场景中,业务程序输出的日志往往规模庞大并且类型纷繁复杂。我们在查询和查看这些日志时,平铺的日志列表会让我们目不暇接,难以快速聚焦找到重要的日志条目。 在观测云中,我们在日志页面提供了聚类分析功能,可以…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者(消息接收)环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中,利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

在虚幻引擎4(UE4)中使用蓝图的详细教程

在虚幻引擎4(UE4)中使用蓝图的详细教程 虚幻引擎4(Unreal Engine 4,简称UE4)是一款功能强大的游戏引擎,广泛应用于游戏开发、虚拟现实、建筑可视化等领域。UE4 提供了一个强大的可视化脚本工具——蓝图&am…

初学STM32 ---高级定时器互补输出带死区控制

互补输出,还带死区控制,什么意思? 带死区控制的互补输出应用之H桥 捕获/比较通道的输出部分(通道1至3) 死区时间计算 举个栗子(F1为例):DTG[7:0]250,250即二进制&#x…

MarkDown怎么转pdf;Mark Text怎么使用;

MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…

华为ensp-BGP路由过滤

学习新思想,争做新青年,今天学习的是BGP路由过滤 实验目的: 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容: 本实…

HackMyVM-Airbind靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 使用ipv6绕过iptables 四、结论 一、测试环境 1、系统环境 渗透机:kali2021.1(192.168.101.127) 靶 机:debian(192.168.101.11…