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 any

    environment {
        // 配置你的项目打包地址
        DEPLOY_DIR = '/home/Projects'
        // 配置你的项目打包服务器的IP地址
        REMOTE_SERVER = '192.168.80.132'
        // 生产环境强烈建议使用非 root 用户
        REMOTE_USER = 'root' 
        // 配置你的Jenkins的SSH的ID
        SSH_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 ,下面是效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值