项目简介
Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来,几乎所有代码都已更改。
安装环境
工具 | 版本 |
---|---|
系统 | CentOS 7 |
Docker | 25.0.4 |
Docker-Compose | 2.24.7 |
Gitea | 1.22.1 |
安装步骤
安装Docker
具体安装步骤见:Docker安装教程
安装docker-compose
具体安装步骤见:Docker-Compose安装教程
安装Gitea
新建目录
mkdir -p /你的路径/gitea/gitea/data /你的路径/gitea/postgresql/data
编写docker-compose.yml文件
在gitea目录下新建docker-compose.yml文件,并填写以下内容
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.22.1
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=xxxxxxxxxx
restart: always
networks:
- gitea
volumes:
- $PWD/gitea/data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8002:3000"
- "9001:22"
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=xxxxxxxx
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- $PWD/postgresql/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
启动容器
在docker-compose.yml文件所在目录下执行
docker-compose up -d
实时查看日志:
docker-compose logs -f
至此Gitea就安装好了。
反向代理(非必须)
我们这里使用Nginx
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name xxx.xxx.com;
charset utf-8;
access_log off;
ssl_certificate /home/cert/fullchain.cer;
ssl_certificate_key /home/cert/xxx.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location / {
proxy_pass http://localhost:8002;
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;
}
}
server {
listen 80;
listen [::]:80;
server_name xxx.xxx.com;
# 核心代码
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
使用教程
Gitea Actions
从Gitea 1.19版本开始,Gitea Actions成为了内置的CI/CD解决方案。
使用 Docker compose 运行 Runner
新建目录
mkdir -p /你的路径/gitea/runner/data /你的路径/gitea/runner/conf
编写docker-compose.yml文件
在gitea目录下新建docker-compose.yml文件,并填写以下内容
version: "3.8"
services:
runner:
image: gitea/act_runner:nightly
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: "${INSTANCE_URL}"
GITEA_RUNNER_REGISTRATION_TOKEN: "${REGISTRATION_TOKEN}"
GITEA_RUNNER_NAME: "${RUNNER_NAME}"
GITEA_RUNNER_LABELS: "${RUNNER_LABELS}"
volumes:
- $PWD/runner/conf/config.yaml:/config.yaml
- $PWD/runner/data:/data
- /var/run/docker.sock:/var/run/docker.sock
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
参数解释
-
CONFIG_FILE
是您的Gitea实例的地址,如
http://192.168.8.8:3000
或https://gitea.com
。 Runner和Job容器(由Runner启动以执行Job)将连接到此地址。 这意味着它可能与用于Web访问的ROOT_URL
不同。 使用回环地址(例如127.0.0.1
或localhost
)是一个不好的选择。 如果不确定使用哪个地址,通常选择局域网地址即可。 -
GITEA_RUNNER_REGISTRATION_TOKEN
用于身份验证和标识,例如
P2U1U0oB4XaRCi8azcngmPCLbRpUGapalhmddh23
。 它只能使用一次,并且不能用于注册多个Runner。 您可以从以下位置获取不同级别的token
,从而创建出相应级别的runner
- 实例级别:管理员设置页面,例如
<your_gitea.com>/admin/actions/runners
。 - 组织级别:组织设置页面,例如
<your_gitea.com>/<org>/settings/actions/runners
。 - 存储库级别:存储库设置页面,例如
<your_gitea.com>/<owner>/<repo>/settings/actions/runners
。
- 实例级别:管理员设置页面,例如
-
GITEA_RUNNER_NAME
Runner名称(可选)。如果留空,将使用主机名。
-
GITEA_RUNNER_LABELS
Runner标签(可选)。如果留空,将使用默认标签。
启动容器
在docker-compose.yml文件所在目录下执行
docker-compose up -d
启动后可以在管理页面上看到新的Runner。
使用Actions
存储库启用Actions
即使对于启用了Gitea实例的Actions,存储库仍默认禁用Actions。
要启用它,请转到存储库的设置页面,例如 your_gitea.com/<owner>/repo/settings
,然后启用 Enable Repository Actions
。
Actions语法
Gitea Actions 基本和 Github Actions的语法一模一样。
我们可以从一个简单的演示开始:
# 工作流的名称
name: Gitea Actions Demo
# 从工作流生成的工作流运行的名称
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
# 若要自动触发工作流,请使用 on 定义哪些事件可以触发工作流运行
on: [push]
# 工作流运行由一个或多个 jobs 组成,默认情况下并行运行
jobs:
# 使用 jobs.<job_id> 为作业提供唯一标识符
Explore-Gitea-Actions:
# 每个作业在 runs-on 指定的运行器环境中运行
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
您可以将上述示例上传为一个以 .yaml
扩展名的文件,放在存储库的 .gitea/workflows/
目录中,例如 .gitea/workflows/demo.yaml
。
请注意,演示文件中包含一些表情符号。 请确保您的数据库支持它们,特别是在使用MySQL时。 如果字符集不是 utf8mb4
,将出现错误,例如 Error 1366 (HY000): Incorrect string value: '\\xF0\\x9F\\x8E\\x89 T...' for column 'name' at row 1
。 有关更多信息,请参阅数据库准备工作。
on: [push]
这一行表示当您向该存储库推送提交时,工作流将被触发。 然而,当您上传 YAML 文件时,它也会推送一个提交,所以您应该在"Actions"标签中看到一个新的任务。
现在就已经成功开始使用Actions。
variables(变量)
您可以创建用户、组织和仓库级别的变量。变量的级别取决于创建它的位置。当创建变量时,变量的名称会被 转换为大写,在yaml文件中引用时需要使用大写。
命名规则
以下规则适用于变量名:
- 变量名称只能包含字母数字字符 (
[a-z]
,[A-Z]
,[0-9]
) 或下划线 (_
)。不允许使用空格。 - 变量名称不能以
GITHUB_
和GITEA_
前缀开头。 - 变量名称不能以数字开头。
- 变量名称不区分大小写。
- 变量名称在创建它们的级别上必须是唯一的。
- 变量名称不能为
CI
。
使用
创建配置变量后,它们将自动填充到 vars
上下文中。您可以在工作流中使用类似 ${{ vars.VARIABLE_NAME }}
这样的表达式来使用它们。
优先级
如果同名变量存在于多个级别,则级别最低的变量优先。 仓库级别的变量总是比组织或者用户级别的变量优先被选中。
注意
若变量值包含特殊字符,如$等,需使用 \
转义,如 123d\$fdf4
,不然使用可能会出现问题。
密钥管理
密钥管理允许您在用户、组织或仓库中存储敏感信息。 密钥管理在 Gitea 1.19+ 版本中可用。
命名规则
以下规则适用于密钥名称:
- 密钥名称只能包含字母数字字符 (
[a-z]
,[A-Z]
,[0-9]
) 或下划线 (_
)。不允许使用空格。 - 密钥名称不能以
GITHUB_
和GITEA_
前缀开头。 - 密钥名称不能以数字开头。
- 密钥名称不区分大小写。
- 密钥名称在创建它们的级别上必须是唯一的。
例如,对于在仓库级别创建的密钥,它在该仓库中必须具有唯一的名称;对于在组织级别创建的密钥,它在该级别上必须具有唯一的名称。
使用
创建配置密钥后,它们将自动填充到 secrets
上下文中。您可以在工作流中使用类似 ${{ secrets.PASSWORD }}
这样的表达式来使用它们。
优先级
如果在多个级别上存在具有相同名称的密钥,则最低级别的密钥优先生效。例如,如果组织级别的密钥与仓库级别的密钥具有相同的名称,则仓库级别的密钥将优先生效。
注意
若密钥值包含特殊字符,如$等,需使用 \
转义,如 123d\$fdf4
,不然使用可能会出现问题。
软件包
从Gitea 1.17版本开始,软件包注册表可以用作常见软件包管理器的公共或私有注册表。
容器注册表
为您的用户或组织发布符合 Open Container Initiative(OCI) 规范的镜像。 该容器注册表遵循 OCI 规范,并支持所有兼容的镜像类型,如 Docker 和 Helm Charts。
要使用容器注册表,您可以使用适用于特定镜像类型的工具。 以下示例使用 docker
客户端。
登录容器注册表
要推送镜像或者如果镜像位于私有注册表中,您需要进行身份验证:
docker login gitea.example.com
如果您使用的是 2FA 或 OAuth,请使用个人访问令牌替代密码进行身份验证。
镜像命名约定
镜像必须遵循以下命名约定:
{registry}/{owner}/{image}
例如,以下是所有者为 testuser
的有效镜像名称示例:
gitea.example.com/testuser/myimage
gitea.example.com/testuser/my-image
gitea.example.com/testuser/my/image
注意: 该注册表仅支持大小写不敏感的标签名称。因此,image:tag
和 image:Tag
将被视为相同的镜像和标签。
推送镜像
通过执行以下命令来推送镜像:
docker push gitea.example.com/{owner}/{image}:{tag}
参数 | 描述 |
---|---|
owner |
镜像的所有者 |
image |
镜像的名称 |
tag |
镜像的标签 |
例如:
docker push gitea.example.com/testuser/myimage:latest
拉取镜像
通过执行以下命令来拉取镜像:
docker pull gitea.example.com/{owner}/{image}:{tag}
Parameter | Description |
---|---|
owner |
镜像的所有者 |
image |
镜像的名称 |
tag |
镜像的标签 |
例如:
docker pull gitea.example.com/testuser/myimage:latest
Maven 软件包注册表
为您的用户或组织发布 Maven 软件包。
要求
要使用 Maven 软件包注册表,您可以使用 Maven 或 Gradle。 以下示例使用 Maven
和 Gradle Groovy
。
配置软件包注册表
要注册软件包注册表,首先需要将访问令牌添加到 settings.xml
文件中:
<settings>
<servers>
<server>
<id>gitea</id>
<configuration>
<httpHeaders>
<property>
<name>Authorization</name>
<value>token {access_token}</value>
</property>
</httpHeaders>
</configuration>
</server>
</servers>
</settings>
然后在项目的 pom.xml
文件中添加以下部分:
<repositories>
<repository>
<id>gitea</id>
<url>https://gitea.example.com/api/packages/{owner}/maven</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>gitea</id>
<url>https://gitea.example.com/api/packages/{owner}/maven</url>
</repository>
<snapshotRepository>
<id>gitea</id>
<url>https://gitea.example.com/api/packages/{owner}/maven</url>
</snapshotRepository>
</distributionManagement>
参数 | 描述 |
---|---|
access_token |
您的个人访问令牌 |
owner |
软件包的所有者 |
Gradle variant
如果您计划在项目中添加来自 Gitea 实例的一些软件包,请将其添加到 repositories 部分中:
repositories {
// other repositories
maven { url "https://gitea.example.com/api/packages/{owner}/maven" }
}
在 Groovy gradle 中,您可以在发布部分中包含以下脚本:
publishing {
// 其他发布设置
repositories {
maven {
name = "Gitea"
url = uri("https://gitea.example.com/api/packages/{owner}/maven")
credentials(HttpHeaderCredentials) {
name = "Authorization"
value = "token {access_token}"
}
authentication {
header(HttpHeaderAuthentication)
}
}
}
}
发布软件包
要发布软件包,只需运行以下命令:
mvn deploy
或者,如果您使用的是 Gradle,请使用 gradle
命令和 publishAllPublicationsToGiteaRepository
任务:
./gradlew publishAllPublicationsToGiteaRepository
如果您想要将预构建的软件包发布到注册表中,可以使用 mvn deploy:deploy-file
命令:
mvn deploy:deploy-file -Durl=https://gitea.example.com/api/packages/{owner}/maven -DrepositoryId=gitea -Dfile=/path/to/package.jar
参数 | 描述 |
---|---|
owner |
软件包的所有者 |
如果存在相同名称和版本的软件包,您无法发布该软件包。您必须先删除现有的软件包。
安装软件包
要从软件包注册表中安装 Maven 软件包,请在项目的 pom.xml
文件中添加新的依赖项:
<dependency>
<groupId>com.test.package</groupId>
<artifactId>test_project</artifactId>
<version>1.0.0</version>
</dependency>
在 Gradle Groovy
中类似的操作如下:
implementation "com.test.package:test_project:1.0.0"
然后运行:
mvn install
支持的命令
mvn install
mvn deploy
mvn dependency:get:
npm Package Registry
为您的用户或组织发布 npm 包。
要求
要使用 npm 包注册表,您需要安装 Node.js 以及与之配套的软件包管理器,例如 Yarn 或 npm 本身。
该注册表支持作用域和非作用域软件包。
以下示例使用具有作用域 @test
的 npm
工具。
配置软件包注册表
要注册软件包注册表,您需要配置一个新的软件包源。
npm config set {scope}:registry=https://gitea.example.com/api/packages/{owner}/npm/
npm config set -- '//gitea.example.com/api/packages/{owner}/npm/:_authToken' "{token}"
参数 | 描述 |
---|---|
scope |
软件包的作用域 |
owner |
软件包的所有者 |
token |
您的个人访问令牌。 |
例如:
npm config set @test:registry=https://gitea.example.com/api/packages/testuser/npm/
npm config set -- '//gitea.example.com/api/packages/testuser/npm/:_authToken' "personal_access_token"
或者,不使用作用域:
npm config set registry https://gitea.example.com/api/packages/testuser/npm/
npm config set -- '//gitea.example.com/api/packages/testuser/npm/:_authToken' "personal_access_token"
发布软件包
在项目中运行以下命令发布软件包:
npm publish
如果已经存在相同名称和版本的软件包,您无法发布该软件包。您必须先删除现有的软件包。
删除软件包
通过运行以下命令删除软件包:
npm unpublish {package_name}[@{package_version}]
参数 | 描述 |
---|---|
package_name |
软件包名称 |
package_version |
软件包版本 |
例如
npm unpublish @test/test_package
npm unpublish @test/test_package@1.0.0
安装软件包
要从软件包注册表中安装软件包,请执行以下命令:
npm install {package_name}
参数 | 描述 |
---|---|
package_name |
软件包名称 |
例如:
npm install @test/test_package
给软件包打标签
该注册表支持版本标签,可以通过 npm dist-tag
管理:
npm dist-tag add {package_name}@{version} {tag}
参数 | 描述 |
---|---|
package_name |
软件包名称 |
version |
软件包版本 |
tag |
软件包标签 |
例如:
npm dist-tag add test_package@1.0.2 release
标签名称不能是有效的版本。所有可解析为版本的标签名称都将被拒绝。
搜索软件包
该注册表支持搜索,但不支持像 author:gitea
这样的特殊搜索限定符。
支持的命令
npm install
npm ci
npm publish
npm unpublish
npm dist-tag
npm view
npm search
评论区