个人搭建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 查看结果

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐