企业的开发工作流
一、环境介绍
与本地开发自然不一致,不是在本地装好 IDE 而后直接 run 代码就可以了。
在企业内部进行开发,则需要进行版本控制、远程代码推送、执行单元测试等一系列步骤。
就拿最基础而言,在本机开发完代码之后,首先需要推送到远程仓库进行版本控制,而后使用 Jenkins 进行集成化部署。
而不是直接用 SSH 在服务器上使用 vim 写好代码直接 run。小心服务器爆炸。
二、环境搭建
1. Ubuntu 安装 Git
# 更新软件源sudo apt update
# 安装 Gitsudo apt install git -y
# 验证安装git --version安装完毕后,则需要配置用户。Git 的每次提交都会记录“是谁提交的”,所以需要设置用户名和邮箱。
# 配置 name 与 email# git config --global user.name "<name>"# git config --global user.email "<mail>"git config --global user.name "qianyue"git config --global user.email "2287867300@qq.com"
# 记得检查git config --global --list那么接下来,需要在本地生成 SSH 密钥,后续放到服务器上,以便于后续推送代码。可以直接使用 VScode 安装 SSH即可!
# 生成公钥ssh-keygen -t rsa -b 4096 -C "2287867300@qq.com"
# 获取公钥cat ~/.ssh/id_rsa.pub
# 记得一定是 id_rsa.pub 哦,不是私钥!是公钥!# 而后登陆服务器,把它放在 ~/.ssh/authorized_keys 下就可以了sudo nano ~/.ssh/authorized_keys现在,就需要在服务器上创建一个仓库了!以便于进行测试是否可以完成拉取与推送!就放在 /srv/git/ 下吧!
# 创建文件夹sudo mkdir -p /srv/git
# 让当前用户拥有该目录权限sudo chown -R $USER:$USER /srv/git
# 如果权限不太对,没有 permission 创建 git 项目的话,检查一下吧ls -la /srv
# 进入此目录cd /srv/git
# 创建名字为 tsukikaze_story 的项目git init --bare tsukikaze_story.git创建好了,那就测试一下使用本机的 VScode 进行 Git Clone吧!
那么这里要切换回本机,VScode 记得安装好 Remote-SSH 与 Git 相关的插件哦。
打开 VScode,选择一个文件夹并打开 terminal 吧!
git clone qianyue@192.168.31.29:/srv/git/tsukikaze_story.git输入密码,即可 clone 啦!那么现在再试试 push 吧!
记得 SSH 要先进入 clone 项目下的文件夹哦,不然它无法读取到 .git 文件。
cd .\tsukikaze_story\
# 添加所有改动git add .
# 提交到本地仓库,记得写说明git commit -m "说明内容"
# push 到 mastergit push origin master
# 当然,如果想学习分支操作的话,就先 push 到自己的吧!git push origin qianyue
# 而后,就发现了报错,是因为远程没有 qianyue 的分支# 则需要手动创建啦!
# 先查看存在哪些分支git brunch
# 创建,并切换到属于自己的分支git checkout -b qianyue
# 然后再进行推送git push -u origin qianyue
# 已经推送好了!那么现在要如何合并呢?# 那么当然是首先要切换为 master 分支,合并后再进行 push!
# 切换到 master 分支并拉取最新变更git checkout mastergit fetch origin
# 合并分支git merge qianyue
# 推送git push -u origin master
# 被合并后的分支就不再需要啦~ 删除即可git branch -d qianyue2. Gitea 的安装
使用图形 GUI 来管理网页代码吧!或许一定需要这个!
老样子,安装之前记得更新软件包。
sudo apt update && sudo apt upgrade -y
# 下载 Giteawget -O gitea https://dl.gitea.io/gitea/1.22.6/gitea-1.22.6-linux-amd64chmod +x giteasudo mv gitea /usr/local/bin/安装完后不要着急启动,先写配置文件!
sudo nano /etc/systemd/system/gitea.service
[Unit]Description=Gitea (Git with a cup of tea)After=network.target
[Service]Type=simpleUser=gitGroup=gitWorkingDirectory=/var/lib/giteaExecStart=/usr/local/bin/gitea webRestart=alwaysRestartSec=2sEnvironment=USER=git HOME=/home/git
[Install]WantedBy=multi-user.targetTips:为什么不使用已有的用户进行配置呢?
这里可能留意到了,这里的用户 User 是 git,Group 也是 git。为什么不使用自带的 root 之类的呢?
1. 最小权限原则Gitea 是一个 Web 服务,它对外暴露 HTTP 端口、处理用户请求、读写仓库。如果它用 `qianyue` 账户运行。一旦 Gitea 出现安全漏洞(比如远程代码执行),攻击者就能以 `qianyue` 的身份操控整个服务器——包括个人文件、SSH 密钥、甚至 `sudo` 权限。而专用的 `git` 用户只有运行 Gitea 所需的最小权限(访问仓库目录、绑定端口),即使被攻破,损失范围也小得多。
2. 职责分离`qianyue` 是管理账户,用来 SSH 登录、执行命令、安装软件。Gitea 服务应该作为一个独立的系统服务运行,不依赖个人账户,这样即使修改自己账户的密码或配置,也不会影响服务。
3. 符合 Linux 惯例绝大多数网络服务(如 `nginx`、`mysql`、`redis`)都会创建专用的系统用户(`www-data`、`mysql`、`redis`)。Gitea 官方也推荐使用 `git` 用户。那么,就创建一个用户吧!# 1. 创建 git 用户(不创建家目录也可以,但建议创建)sudo useradd -m -s /bin/bash git
# 2. 设置一个密码(可选,一般不需要登录)sudo passwd git # 可以设置一个复杂密码,或者跳过(直接按回车两次不设置)
# 3. 创建 Gitea 工作目录并授权sudo mkdir -p /var/lib/giteasudo chown -R git:git /var/lib/gitea
# 4. 如果 Gitea 二进制不在 /usr/local/bin/gitea,请调整路径。我们之前把它放在那里了,确认一下:ls -l /usr/local/bin/gitea# 如果没有,先下载并移动(参考之前的步骤)
# 5. 确保二进制有执行权限sudo chmod +x /usr/local/bin/gitea是时候启动了!
sudo systemctl daemon-reloadsudo systemctl start giteasudo systemctl enable gitea
# 记得检查状态哦!sudo systemctl status gitea试着访问一下吧!当然,防火墙需要开启 3000 端口哦!
以及,相关的访问文件夹记得给好权限哦!(chown git
3. MySQL 的部署
结果发现 Gitea 也需要使用 MySQL,且未来研究开发也需要用到这个。就直接安装吧!
# 老惯例,先更新软件包sudo apt update && sudo apt upgrade -y
# 安装 MySQLsudo apt install mysql-server -y安装好了,改个密码先!
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';FLUSH PRIVILEGES;改好密码了的话,就继续完成先前的 Gitea 的安装吧!
1. 为 Gitea 创建一个专有用户
CREATE DATABASE gitea;CREATE USER 'gitea'@'localhost' IDENTIFIED BY '<password>';GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost';FLUSH PRIVILEGES;4. Jenkins 的部署
由于目前的研究方向为 Flask,正好用于复习 Python 的增删改查,且同时以便于后续编写自动化脚本。所以在 Jenkins 上部署一个 Flask 框架用于演示即可。
所以需要按照以下步骤进行部署:
-
安装 Python/Java 环境
-
安装配置 Jenkins
-
创建 Flask 项目 → 推送到 Gitea(镜像到 GitHub) → Jenkins 配置并运行
1. Java 的安装
为了更好的管理 Java 版本,最好安装一个 jenv 用于管理特定文件夹所需的 Java 版本。
进入特定的项目目录。然后运行 jenv local 命令。这会在当前目录下创建一个名为 .java-version 的文件,记录下指定的Java版本。之后,每次 cd 进这个目录,jenv 都会自动为切换到正确的Java版本,非常方便。
那么首先,安装 jenv 吧!以及 jenv 需要 git 和 curl ,先前已经安装了git ,记得安装 curl 喔!
sudo apt update && sudo apt upgrade -ysudo apt install git curl -y将 jenv 的源代码从 GitHub 克隆到(qianyue)的用户目录下的 .jenv 文件夹
git clone https://github.com/jenv/jenv.git ~/.jenv我们需要让系统每次启动终端时都能找到 jenv 命令。将以下两行添加到 ~/.bashrc 文件中。
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrcecho 'eval "$(jenv init -)"' >> ~/.bashrc
# 添加完成后,重新加载 ~/.bashrc 文件,让配置立即生效source ~/.bashrc那么,接下来就是安装 JDK 了!
sudo apt update && sudo apt upgrade -ysudo apt install openjdk-17-jdk -ysudo apt install openjdk-21-jdk -y安装完啦!接下来配置 jvn,记得先看看安装文件夹下面有几个版本。
# 查看安装版本ls /usr/lib/jvm/
# 然后根据实际路径,用 jenv add 命令将它们添加进去,jenv 会为每个JDK生成多个可以调用的别名。# 假设 Java 17 的安装路径是 /usr/lib/jvm/java-17-openjdk-amd64jenv add /usr/lib/jvm/java-17-openjdk-amd64# 假设 Java 21 的安装路径是 /usr/lib/jvm/java-21-openjdk-amd64jenv add /usr/lib/jvm/java-21-openjdk-amd64
# 设置全局默认Java版本jenv global 17.0
# 然后用 java -version 验证是否切换成功java -versionqianyue@QianYue-Ubuntu:~$ jenv global 17.0qianyue@QianYue-Ubuntu:~$ java -version
openjdk version "17.0.18" 2026-01-20OpenJDK Runtime Environment (build 17.0.18+8-Ubuntu-124.04.1)OpenJDK 64-Bit Server VM (build 17.0.18+8-Ubuntu-124.04.1, mixed mode, sharing)
qianyue@QianYue-Ubuntu:~$ jenv global 21.0qianyue@QianYue-Ubuntu:~$ java -version
openjdk version "21.0.10" 2026-01-20OpenJDK Runtime Environment (build 21.0.10+7-Ubuntu-124.04)OpenJDK 64-Bit Server VM (build 21.0.10+7-Ubuntu-124.04, mixed mode, sharing)2. Python 的安装
安装 Python 3.10+(Ubuntu 默认可能 3.8,建议装 3.10 或 3.12)。
sudo apt update && sudo apt upgrade -ysudo apt install python3 python3-pip python3-venv -yPython 开发建议使用虚拟环境,以便于隔离项目之间的依赖哦。那么稍后再说 Python 吧!
3. 部署 Jenkins
此为今日最大的难题了!首先查看官网的 docs 是如何安装的吧。
Jenkins官网:https://www.jenkins.io/doc/book/installing/linux/
sudo wget -O /etc/apt/keyrings/jenkins-keyring.asc \ https://pkg.jenkins.io/debian-stable/jenkins.io-2026.keyecho "deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc]" \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list **>** /dev/nullsudo apt updatesudo apt install jenkinsLTS 版本需要安装 JDK21,并使用以上方法进行安装即可。然后,启动!
# 启动项目sudo systemctl start jenkins
# 检查服务sudo systemctl status jenkins首次启动,需要解锁。记得按照给的路径使用sudo权限查看即可。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword我擦,怎么这么多插件,就先推荐安装吧。剩下的插件到时候再说。
4. 拉取第一个项目
那么,就先尝试建造一个基础的 Freestyle Project吧!在拉取 Gitea 的项目之前,需要在 Gitea 上创建一个 Access Token 用于 Jenkins 访问 Gitea 的项目,并完成拉取操作。
账户 -> 应用 -> 管理 Access Token,试试看吧!
而后回到 Jenkins 里,创建项目后,在源码管理填写好 Repo 的 URL,而后填写好 Access Token(填写在 Credentials 内) 即可拉取项目。
5. 自动拉取项目
想要在 Repo 更新的时候就自动拉取吗?那么肯定得需要一个 Hook,用于在 Jenkins 与 Gitea 之间通信呢。
那么首先,需要在 Jenkins 内安装一个 Generic Webhook Trigger 插件。
而后,回到先前的项目,在配置中的 Triggers 勾选 Generic Webhook Trigger。
看着可选参数怪多的,实际上认真看,只需要填写 Token 相关即可。
而后,在 Token 填写一个密码,以便于 Gitea 对 Jenkins 发送拉取仓库的申请。Cause 里可以填个备注什么的,防止遗忘是因为什么触发的 Trigger。
接下来返回 Gitea 的 Repo,在 Web Hook 内添加一个新的 Hook,侦测到新的 Push 事件时,填写好目标 URL。
这里根据 Jenkins 的规则:
将 JENKINS_URL 填写为 服务器的 URL。在 /invoke?token=TOKEN_HERE 后,填写好 Token。
Optional token. If it is specified then this job can only be triggered if that token is supplied when invoking **http://JENKINS_URL/generic-webhook-trigger/invoke**. It can be supplied as a:Query parameter **/invoke?token=TOKEN_HERE**A token header **token: TOKEN_HERE**A Authorization: Bearer header **Authorization: Bearer TOKEN_HERE**然后试着推送代码吧!这样的话,Gitea 只要获取到 Push 更新,Github(镜像仓库) 与 Jenkins(自动推送) 可以一并更新啦!
Tips:如果 Gitea 与 Jenkins 都部署在本地,触发了 Webhook 的防火墙怎么办?
这其实是个“官方保护措施”—— Gitea 默认开了一个网络防火墙,Webhook 只能往外发,不能往内网发,防止恶意请求打穿内部,结果把咱们自己的 Jenkins 也给防住了。咱们把它打开就行,很简单。
打开Gitea的app.ini配置文件,在[webhook]部分添加一行白名单,就能允许发往Jenkins了。
配置文件通常在 /etc/gitea/app.ini 或 /data/gitea/conf/app.ini,用 sudo find / -name app.ini 找一下就知道了。
搞定之后在 Webhook 设置里点一下“测试推送”就行啦~
[webhook]ALLOWED_HOST_LIST = 192.168.31.29三、小结
那么截止至此,工作流就已经搭建完毕了。顺带着还启用了一下 Github 作为镜像仓库。
多备份代码,以备不时之需嘛。
那么,经过了这两天的复习和磨练,想必 Linux 的部分已经成功找回来了吧。
而且还巩固复习了 MySQL 的安装。还有各个环境使用 apt 进行部署。
最重要的是,熟悉了 Gitea 与 Jenkins 的部署与项目拉取,这是很大的进步!
每天进步一点点的话,日积跬步,行至千里!
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













