企业的开发工作流

3079 字
15 分钟
企业的开发工作流

一、环境介绍#

与本地开发自然不一致,不是在本地装好 IDE 而后直接 run 代码就可以了。

在企业内部进行开发,则需要进行版本控制、远程代码推送、执行单元测试等一系列步骤。

就拿最基础而言,在本机开发完代码之后,首先需要推送到远程仓库进行版本控制,而后使用 Jenkins 进行集成化部署。

而不是直接用 SSH 在服务器上使用 vim 写好代码直接 run。小心服务器爆炸。

二、环境搭建#

1. Ubuntu 安装 Git#

Terminal window
# 更新软件源
sudo apt update
# 安装 Git
sudo apt install git -y
# 验证安装
git --version

安装完毕后,则需要配置用户。Git 的每次提交都会记录“是谁提交的”,所以需要设置用户名和邮箱。

Terminal window
# 配置 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即可!

Terminal window
# 生成公钥
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/ 下吧!

Terminal window
# 创建文件夹
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 吧!

Terminal window
git clone qianyue@192.168.31.29:/srv/git/tsukikaze_story.git

输入密码,即可 clone 啦!那么现在再试试 push 吧!

记得 SSH 要先进入 clone 项目下的文件夹哦,不然它无法读取到 .git 文件。

Terminal window
cd .\tsukikaze_story\
# 添加所有改动
git add .
# 提交到本地仓库,记得写说明
git commit -m "说明内容"
# push 到 master
git 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 master
git fetch origin
# 合并分支
git merge qianyue
# 推送
git push -u origin master
# 被合并后的分支就不再需要啦~ 删除即可
git branch -d qianyue

2. Gitea 的安装#

使用图形 GUI 来管理网页代码吧!或许一定需要这个!

老样子,安装之前记得更新软件包。

Terminal window
sudo apt update && sudo apt upgrade -y
# 下载 Gitea
wget -O gitea https://dl.gitea.io/gitea/1.22.6/gitea-1.22.6-linux-amd64
chmod +x gitea
sudo 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=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea
ExecStart=/usr/local/bin/gitea web
Restart=always
RestartSec=2s
Environment=USER=git HOME=/home/git
[Install]
WantedBy=multi-user.target

Tips:为什么不使用已有的用户进行配置呢?

这里可能留意到了,这里的用户 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` 用户。
那么,就创建一个用户吧!
Terminal window
# 1. 创建 git 用户(不创建家目录也可以,但建议创建)
sudo useradd -m -s /bin/bash git
# 2. 设置一个密码(可选,一般不需要登录)
sudo passwd git # 可以设置一个复杂密码,或者跳过(直接按回车两次不设置)
# 3. 创建 Gitea 工作目录并授权
sudo mkdir -p /var/lib/gitea
sudo 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

是时候启动了!

Terminal window
sudo systemctl daemon-reload
sudo systemctl start gitea
sudo systemctl enable gitea
# 记得检查状态哦!
sudo systemctl status gitea

试着访问一下吧!当然,防火墙需要开启 3000 端口哦!

以及,相关的访问文件夹记得给好权限哦!(chown git 给相关文件夹)

3. MySQL 的部署#

结果发现 Gitea 也需要使用 MySQL,且未来研究开发也需要用到这个。就直接安装吧!

Terminal window
# 老惯例,先更新软件包
sudo apt update && sudo apt upgrade -y
# 安装 MySQL
sudo 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 框架用于演示即可。

所以需要按照以下步骤进行部署:

  1. 安装 Python/Java 环境

  2. 安装配置 Jenkins

  3. 创建 Flask 项目 → 推送到 Gitea(镜像到 GitHub) → Jenkins 配置并运行

1. Java 的安装#

为了更好的管理 Java 版本,最好安装一个 jenv 用于管理特定文件夹所需的 Java 版本。

进入特定的项目目录。然后运行 jenv local 命令。这会在当前目录下创建一个名为 .java-version 的文件,记录下指定的Java版本。之后,每次 cd 进这个目录,jenv 都会自动为切换到正确的Java版本,非常方便。

那么首先,安装 jenv 吧!以及 jenv 需要 gitcurl ,先前已经安装了git ,记得安装 curl 喔!

Terminal window
sudo apt update && sudo apt upgrade -y
sudo apt install git curl -y

jenv 的源代码从 GitHub 克隆到(qianyue)的用户目录下的 .jenv 文件夹

Terminal window
git clone https://github.com/jenv/jenv.git ~/.jenv

我们需要让系统每次启动终端时都能找到 jenv 命令。将以下两行添加到 ~/.bashrc 文件中。

Terminal window
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(jenv init -)"' >> ~/.bashrc
# 添加完成后,重新加载 ~/.bashrc 文件,让配置立即生效
source ~/.bashrc

那么,接下来就是安装 JDK 了!

sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-17-jdk -y
sudo apt install openjdk-21-jdk -y

安装完啦!接下来配置 jvn,记得先看看安装文件夹下面有几个版本。

Terminal window
# 查看安装版本
ls /usr/lib/jvm/
# 然后根据实际路径,用 jenv add 命令将它们添加进去,jenv 会为每个JDK生成多个可以调用的别名。
# 假设 Java 17 的安装路径是 /usr/lib/jvm/java-17-openjdk-amd64
jenv add /usr/lib/jvm/java-17-openjdk-amd64
# 假设 Java 21 的安装路径是 /usr/lib/jvm/java-21-openjdk-amd64
jenv add /usr/lib/jvm/java-21-openjdk-amd64
# 设置全局默认Java版本
jenv global 17.0
# 然后用 java -version 验证是否切换成功
java -version
qianyue@QianYue-Ubuntu:~$ jenv global 17.0
qianyue@QianYue-Ubuntu:~$ java -version
openjdk version "17.0.18" 2026-01-20
OpenJDK 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.0
qianyue@QianYue-Ubuntu:~$ java -version
openjdk version "21.0.10" 2026-01-20
OpenJDK 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)。

Terminal window
sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv -y

Python 开发建议使用虚拟环境,以便于隔离项目之间的依赖哦。那么稍后再说 Python 吧!

3. 部署 Jenkins#

此为今日最大的难题了!首先查看官网的 docs 是如何安装的吧。

Jenkins官网:https://www.jenkins.io/doc/book/installing/linux/

Terminal window
sudo wget -O /etc/apt/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key
echo "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/null
sudo apt update
sudo apt install jenkins

LTS 版本需要安装 JDK21,并使用以上方法进行安装即可。然后,启动!

Terminal window
# 启动项目
sudo systemctl start jenkins
# 检查服务
sudo systemctl status jenkins

首次启动,需要解锁。记得按照给的路径使用sudo权限查看即可。

Terminal window
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 的部署与项目拉取,这是很大的进步!

每天进步一点点的话,日积跬步,行至千里!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
企业的开发工作流
https://springtsuki.xucjno.com/posts/springtsuki/notes/works/企业的开发工作流/
作者
SpringTsuki
发布于
2025-05-08
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
17
分类
8
标签
16
总字数
19,430
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录