前言
Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典运用集成,诸如代码剖析东西 SonarQube、继续集成东西 Drone、Jenkins 以及用于工单办理的客户端插件(VSCode、Jenkins IDE)。 不久之后,Gitea 也会兼容 GitHub Actions 使得 CI/CD 流程更加简单。
今天要介绍的是 Gitea 与 Jenkins CI/CD 的集成。
关于 Jenkins
Jenkins 是一款开源的、供给友爱操作界面的继续集成(CI)东西,在国内外都有很多的运用者。Jenkins 具有以下优点:
- 界面友爱
- 插件丰厚
- 可编程的 API
- 历史悠久、社区活跃
因此 Jenkins 也被很多的企业或许安排用来构建自己的 CI/CD 体系。
然而,Jenkins 自身并不具备源代码办理的才能,关于一个完好的 CI/CD 体系来讲,有必要要从源代码办理体系开端。所以,本文将介绍如何运用 Gitea 和 Jenkins 来构建一个完好的 CI/CD 体系。
关于 Jenkins 的 Gitea 插件
Jenkins 支持从通用 Git 服务器拉取代码,无需装置额外的插件即可合作 Gitea 运用。用于 Jenkins 的 Gitea 插件效果在于将 Jenkins CI/CD 权限直接赋予 Gitea 服务器上被授权的安排或个人,用户无需独自为每一个库房装备 Jenkins 触发器即可享受 CI/CD 功用。
当用户在库房中创立 Jenkinsfile
时,Jenkins 能够主动扫描到该库房并发动 CI/CD 流水线。
插件概况:plugins.jenkins.io/gitea/
流程概览
本次集成实践首要包括以下内容
- Gitea Plugin 插件的介绍和装备
- Gitea + Jenkins 的 CI/CD 环境建立
- 运用 Gitea 的 Webhook 功用,从 Gitea 侧触发 Jenkins Pipeline
Gitea
- 在 Gitea 注册用户 Jenkins,同时为用户 Jenkins 增加 API Access Token,用于 Jenkins 从 Gitea 拉取代码
- 在 Gitea 中创立安排 GiteaTeam,并且将 Jenkins 用户增加为安排办理员
- 在 GiteaTeam 安排中创立代码库房 JenkinsExample
- 修正 Gitea 服务器的 Webhook 设置
Jenkins
- 登录 Jenkins 办理面板,装置插件:Gitea
- 翻开 Manage Credentials 增加 Gitea 拜访令牌,用于从 Gitea 拉取代码、经过 API 装置 Webhook
- 翻开 Configure System 装备 Gitea Server 插件,填写 Gitea 服务器地址和 Mange Hooks 令牌(选用上一步填写的 Credentials)
- 集成演示 JenkinsExample
Gitea + Jenkins 的 Docker Compose 装备示例
如果您还没有建立以上环境,咱们供给了一个 docker-compose.yml
模板帮助您快速发动,模板内容附在本文最终。
Gitea 与 Jenkins 的集成实践
生成 Gitea 拜访令牌
在本示例中,咱们为 Jenkins 独自创立了一个名为 Jenkins 的 Gitea 用户账号,便于 Jenkins 运用令牌拜访 Gitea 服务器。
为 Jenkins 颁发 Gitea 项意图拜访权限
在本示例中,咱们在 Gitea 服务器创立了一个安排 GiteaTeam 用于存放项目源代码。同时,将 Jenkins 账号加入 GiteaTeam 的办理员用户组,便于 Jenkins 直接拜访当时项意图代码库房、API、Webhook。
修正 Gitea 服务器的 Webhook 白名单
出于安全考虑,您经过 Gitea Webhook 触发外部服务器的呼应前需求设定 webhook.ALLOWED_HOST_LIST
白名单来操控 Webhook 的意图地址。具体信息参阅文档 Webhook。
修正装备时,翻开 conf/app.ini
,增加 ALLOWED_HOST_LIST = *
到 [webhook]
栏目中,并重启 Gitea 服务器。例如:
[webhook]
ALLOWED_HOST_LIST = *
装置 Gitea Plugin
在 Jenkins 顺次翻开 体系办理 – 插件办理,在 可选插件 中查找并装置 Gitea。
在 Jenkins 中增加 Gitea 拜访令牌
翻开 Manage Credentials 增加 Gitea 拜访令牌,用于从 Gitea 拉取代码、经过 API 装置 Webhook。
- Kind: 挑选 Gitea Personal Access Token
- Scope: 挑选 Global
- Token: 填写从 Gitea 申请的拜访令牌
在 Jenkins 中装备 Gitea Server
Gitea Plugin 装置完结后,在 Jenkins 顺次翻开 体系办理 – 体系装备,找到 Gitea Server 并填写:
- Name: 恣意填写一个名称
- Server URL: 填写 Gitea 服务器的 HTTP 地址,如
https://gitea.com
- 勾选 Manage hooks 并挑选拜访令牌。这将答应 Jenkins 运用您挑选的 Gitea 帐户主动装备 Gitea Webhook,当代码提交到 Gitea 时,Gitea 经过 Webhook (
http://JENINS_URL/gitea-webhook/post
) 触发 Jenkins CI。
在 Jenkins 中创立 Organization Folder
Organization Folder 使命支持从 Gitea 服务器扫描并主动增加安排或用户目录下的所有代码库房。当代码库房中包括 Jenkinsfile
时会主动将该库房加入流水线队列。在这种模式下,该安排下的代码库房无需独自装备 Webhook 便能够主动与 Jenkins CI 集成。
装备 Repository Sources
翻开方才创立的 Organization Folder。在 Projects – Repository Sources 中增加 Gitea Organization 并填写:
- Server: 挑选一个 Gitea Server
- Owner: 与 Jenkins 集成的 Gitea 安排或个人目录
- Credentials: 挑选一个用于拜访 Gitea 的 Jenkins 账号拜访令牌(应该拥有 Owner 的办理权限)
稍后,Jenkins 就会开端扫描 Gitea 服务器上的 GiteaTeam 安排,在 Scan Gitea Organization Log
呈现出扫描结果:
集成演示 JenkinsExample
在上面的集成装备中,咱们为 Gitea 服务器上的 GiteaTeam 安排集成了 Jenkins CI 才能。所以,当用户在 GiteaTeam 安排中创立包括 Jenkinsfile
的代码库房时, Jenkins CI 也将主动发动,为 Gitea 装备 Webhook。当用户再次提交代码到 Gitea 服务器时,Jenkins 就能被 Gitea Webhook 触发构建过程。
创立 JenkinsExample 项目
Jenkinsfile 示例
JenkinsExample 项目中仅包括一个有效的 Jenkinsfile
示例文件,用于演示 Jenkins CI 与 Gitea 的集成。
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo build'
}
}
stage('Test'){
steps {
sh 'echo test'
}
}
stage('Deploy') {
steps {
sh 'echo publish'
}
}
}
}
查看 Gitea Plugin 创立的 Webhook
当咱们的安排与 Jenkins 集成之后,Gitea Plugin 插件主动为新建的 Jenkins 项目创立 Webhook。(条件是在 Gitea Plugin 中勾选 Manage hook)
查看 Gitea Plugin 主动为 Gitea 创立的 Webhook:
提交代码更改并查看 Jenkins CI 流程
- 在 Gitea 的提交列表中,咱们能够观察到当时代码提交的构建状况,黄色的 ● 表明正在进行构建使命,绿色的 ✔ 表明现已完结的构建使命。
- 点击上面的 ●、✔、 符号能够进入 Jenkins Pipeline 查看使命概况状况。
Gitea + Jenkins 的 Docker Compose 装备示例
最新的 Docker Enginine 现已集成了 docker compose 命令,您能够运用 docker compose up -d 一键发动 Gitea 和 Jenkins。
version: "3"
volumes:
jenkins_home:
services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 3000:3000
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts-jdk11
restart: on-failure
privileged: true
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
ports:
- 8080:8080
- 50000:50000