这篇技术文章需要结合我写的前两篇文章来一起看
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 ,下面是效果