阿栋的博客

翻身不粘锅

Jenkins + Gitea实现持续集成

本文默认你已安装 jenkinsgitea

持续集成是指开发代码的实践,当上传代码之后,立即进行单元测试,与原代码相比判断是否可以集成到一起。每次集成通过自动构建的校验,发现构建中的错误

下面将介绍在Docker容器内,使用Jenkins和Gitea完成代码自动化打包、发布和部署的两种方案

方案一、不安装Gitea插件,自建webhook

创建项目

在gitea上创建项目,填写项目名称其他一律默认

image-20200728144604955

在Jenkins上创建项目,类型选择自由风格的项目(项目名最好一致方便辨认),其他配置先不管,点保存

image-20200728144858415

分配密钥

在本地生成公私钥对

1
ssh-keygen -t rsa -b 4096 -C "your_email"

在Jenkins的全局凭证里添加私钥,选择SSH,输入名称和创建时设的密码

image-20200728150944078

在gitea项目的仓库设置 -> 管理部署密钥,添加.pub结尾的公钥

image-20200728152106056

配置jenkins项目

进入之前新建的jenkins项目配置页面,源码管理选择Git,填入gitea项目的SSH链接,凭证选刚才添加的

image-20200728153933816

配置构建触发器,勾选触发远程构建,在身份验证令牌(也就是Token)输入一串自定义字符串

image-20200728154321374

创建webhook

进入gitea项目的仓库设置 -> 管理web钩子,添加Gitea类型

image-20200728154723498

目标URL模式如下:Jenkins访问地址/job/Jenkins项目名/build?token=Jenkins项目中配置的身份验证令牌,其他默认

image-20200728155307582

测试推送

进入刚才新建的web钩子,测试推送

image-20200728160011918

不过这里有个问题,这个链接在不同的服务器上使用是没有问题的,但是如果gitea和Jenkins运行在同一台服务器上会请求失败报403错误:HTTP ERROR 403 No valid crumb was included in the request

image-20200728161128096

这是因为Jenkins的跨域问题。不过自2.204.6版本开始,Jenkins就删除了禁用跨站请求伪造保护的功能,现在需要添加凭证到请求中才可访问

进入jenkins个人设置 -> API Token,生成新token并复制

image-20200728160314948

重新配置web钩子,新模式如下:jenkinsID(登录名):token@Jenkins访问地址/job/Jenkins项目名/build?token=Jenkins项目中配置的身份验证令牌

image-20200728160729339

测试推送,成功

image-20200728161415907

方案二、使用Gitea插件,自动生成webhook(推荐)

安装插件

进入系统管理 -> 插件管理,安装gitea插件并重启

image-20200728170237434

配置Gitea服务

进入系统管理 -> 系统配置 -> Gitea Server,新增gitea服务。设置名称和gitea的访问地址,勾选Manage hooks让gitea服务自动帮你在项目新增web钩子

image-20200728172742247

添加凭证推荐用gitea管理员的token, 在gitea的个人设置 -> 应用里生成令牌(token),凭证添加范围选择系统

image-20200728172439864

image-20200728172634946

创建组织和生成“jenkins”token

使用管理员账户登录gitea,创建组织

image-20200728175452658

进入管理后台 -> 账户管理,创建用户名为“jenkins”的账户(该号专门用于生成token)并添加到刚才创建的组织中

image-20200728180217199

image-20200728180244077

退出gitea,用“Jenkins”账号登录,进入个人设置 -> 应用,生成token并复制

image-20200728180548791

新建jenkins任务

新建任务,类型选择Gitea Organization

image-20200728181014043

配置Projects -> Gitea Organization,添加凭证,范围选该项目,使用刚才“jenkins”账户生成的token。Owner组织名称需要和gitea的组织名一致,保存

image-20200728181351366

因为还未在组织创建仓库,所以扫描出来的存储库为0

image-20200728181753105

创建gitea项目

拥有者选刚才创建的组织,其他默认

image-20200728181945175

用SSH拉取该项目,在根目录创建名为Jenkinsfile的脚本文件,添加脚本示例:

1
2
3
4
5
6
7
8
9
10
11
12
// Jenkinsfile
pipeline {
agent any

stages {
stage('Build') {
steps {
echo 'hello world'
}
}
}
}

Gitea Organization就是靠Jenkinsfile文件来识别项目。推送完毕后,在Jenkins的组织文件夹(刚才新建的任务)内会生成同名项目,在gitea的项目设置里,也会自动生成webhook

image-20200728183247985

image-20200728183238041

测试推送

成功

image-20200728183538380

image-20200728183541485

Jenkinsfile是脚本文件,和 Linux的 shell文件类似,具体操作看第七周的最后四节官方文档

参考网站

https://stackoverflow.com/questions/38137760/jenkins-rest-api-create-job

https://blog.csdn.net/erhaiou2008/article/details/103983755

https://www.cnblogs.com/kazihuo/p/12937071.html

http://willless.com/jenkins-and-gitea-automated-packaging.html

https://plugins.jenkins.io/gitea/