在阿里云服务器上使用Gitea搭建 Git 仓库托管平台及CI/CD流水线的用法练习
个人搭建Git托管平台能确保数据隐私与安全,适合注重自主性和隐私的开发者。相比于GitLab,Gitea的资源需求非常低,同时提供了大部分必要的Git托管功能,非常适合个人搭建Git托管平台。
1. 环境准备
阿里云服务器
需要准备git环境
2. 搭建Gitea托管平台
Gitea 的官方文档建议不要使用 root 用户运行服务,因为 root 权限过高可能带来安全风险。所以我们可以先创建一个专门的非特权用户。
cd /home/
useradd -m gitea
passwd gitea
然后切换到gitea用户
su - gitea
cd /home/gitea
下载 Gitea 可执行文件并赋予执行权限
wget -O gitea https://dl.gitea.com/gitea/1.21.10/gitea-1.21.10-linux-amd64
chmod +x gitea
启动服务
cd /home/gitea
./gitea
然后在浏览器上(Windows系统上的浏览器即可)访问安装地址:http://ip:3000。注意:在这之前需要在阿里云的控制台设置安全组,放行3000端口。
进行初始配置,如果云服务器上安装了MySQL,那么可以选用MySQL数据库。没有安装可以使用SQLlite3。
安装完成之后,需要进行注册,然后登录
点击仓库列表右边的加号图标可以创建代码仓库。
3. git操作
3.1 初始化仓库
git init
3.2 克隆仓库
可以通过git clone命令,可以将远程仓库克隆至本地
git clone http://47.99.155.25:3000/wangxiang/GiteaTest.git
3.3 添加文件到暂存区和提交文件
添加一个文件到暂存区,在git add 后面跟文件名
git add <filename>
添加所有文件
git add .
使用git commit可以提交暂存区的文件到本地仓库。
git commit -m "message"
如果直接输入git commit 会进入vim模式,可以在该模式中输入提交信息。
3.4 将本地仓库中代码推送到远程仓库
如果本地仓库没有关联到远程仓库,需要先进行关联
git remote add origin <远程仓库地址>
使用git push将本地仓库中的代码推送到远程仓库当中。
git push <远程仓库名> <分支名>
3.5 从远程仓库中拉取代码
可以使用git pull命令拉取远程仓库中的代码,在修改代码前,需要使用git pull命令更新本地仓库
3.6 创建分支
可以使用git checkout 创建分支,git checkout -b <分支名>则可以创建分支并切换到创建的分支
3.7 合并分支
可以使用git merge 或git rebase 合并分支。git merge合并分支并创建一个合并提交,适合保留分支历史。而git rebase 将一个分支的提交应用到另一个分支顶部,保持提交历史线性。
4. CI/CD流水线的用法练习
4.1 在Gitea上创建仓库并开启Actions功能
创建仓库后在仓库对应的设置中启用Actions功能
4.2 安装Act Runner(如果没有安装则需要安装)
首先确保 Docker 已安装并运行
sudo systemctl status docker
获取 Runner 注册令牌
在Gitea的设置中找到Actions,然后点击创建Runner,就可以看到注册token
准备 Runner 的本地挂载目录
# 在你的用户主目录下创建一个文件夹
mkdir ~/gitea-runner-data
# 进入这个目录
cd ~/gitea-runner-data
注册并运行 Act Runner
docker run -d \
--name my-gitea-runner \
--restart always \
-v $(pwd):/data \
-v /var/run/docker.sock:/var/run/docker.sock \
-e GITEA_INSTANCE_URL=[你的Gitea实例URL] \
-e GITEA_RUNNER_REGISTRATION_TOKEN=[你刚刚复制的注册令牌] \
-e GITEA_RUNNER_NAME=my-ali-runner \
-e GITEA_RUNNER_LABELS=linux:docker://node:16-bullseye \
gitea/act_runner:latest
4.3 编写测试项目
因为服务器的配置不高(2核2G),所以我准备用一个轻量的C++项目来进行练习。
main.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello, CI/CD!" << endl;
return 0;
}
teat_main.cpp
#include <iostream>
#include <string>
#include <cstdio>
#include <cassert>
using namespace std;
// 执行一个命令并返回它的输出
string exec(const char* cmd) {
char buffer[128];
string result = "";
FILE* pipe = popen(cmd, "r");
if (!pipe) {
return "popen failed!";
}
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
result += buffer;
}
pclose(pipe);
// 移除末尾的换行符
if (!result.empty() && result[result.length()-1] == '\n') {
result.erase(result.length()-1);
}
return result;
}
int main() {
cout << "Running tests..." << endl;
// 执行编译好的主程序,并捕获它的输出
string output = exec("./hello_app");
// 断言:检查输出是否和预期完全一致
assert(output == "Hello, CI/CD!");
cout << "All tests passed!" << endl;
return 0;
}
Makefile
CXX = g++
CXXFLAGS = -std=c++11 -Wall
APP_TARGET = hello_app
TEST_TARGET = test_runner
APP_SRCS = main.cpp
TEST_SRCS = test_main.cpp
all: $(APP_TARGET)
# 生成主程序
$(APP_TARGET): $(APP_SRCS)
$(CXX) $(CXXFLAGS) -o $(APP_TARGET) $(APP_SRCS)
# 生成测试程序
$(TEST_TARGET): $(TEST_SRCS)
$(CXX) $(CXXFLAGS) -o $(TEST_TARGET) $(TEST_SRCS)
# 执行测试
test: $(APP_TARGET) $(TEST_TARGET)
@echo "--- Running application tests ---"
./$(TEST_TARGET)
# 清理生成的文件
clean:
rm -f $(APP_TARGET) $(TEST_TARGET)
4.4 编写.gitea/workflows/ci.yaml并提交
name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build-and-test:
runs-on: linux
steps:
# 检查代码
- name: Checkout repository
uses: actions/checkout@v4
# 使用 make 命令,根据 Makefile 的规则生成所有目标文件
- name: Build application and tests
run: make all $(TEST_TARGET) # 同时构建主程序和测试程序
# 同样使用 make 命令来触发测试规则
- name: Run tests
run: make test
# 模拟部署
- name: Deploy (simulation)
if: success()
run: |
echo "完成所有测试
echo "开始部署..."
echo "部署成功!"
通过git向仓库提交代码
git add .
git commit -m '提交CI/CD测试代码'
git push origin main
4.5 查看结果
更多推荐
所有评论(0)