持续集成是指开发代码的实践,当上传代码之后,立即进行单元测试,与原代码相比判断是否可以集成到一起。每次集成通过自动构建的校验,发现构建中的错误
下面将介绍在Docker容器内,使用Jenkins和Gitea完成代码自动化打包、发布和部署的两种方案
方案一、不安装Gitea插件,自建webhook
创建项目
在gitea上创建项目,填写项目名称其他一律默认
在Jenkins上创建项目,类型选择自由风格的项目(项目名最好一致方便辨认),其他配置先不管,点保存
分配密钥
在本地生成公私钥对
1 | ssh-keygen -t rsa -b 4096 -C "your_email" |
在Jenkins的全局凭证里添加私钥,选择SSH,输入名称和创建时设的密码
在gitea项目的仓库设置 -> 管理部署密钥,添加.pub结尾的公钥
配置jenkins项目
进入之前新建的jenkins项目配置页面,源码管理选择Git,填入gitea项目的SSH链接,凭证选刚才添加的
配置构建触发器,勾选触发远程构建,在身份验证令牌(也就是Token)输入一串自定义字符串
创建webhook
进入gitea项目的仓库设置 -> 管理web钩子,添加Gitea类型
目标URL模式如下:Jenkins访问地址/job/Jenkins项目名/build?token=Jenkins项目中配置的身份验证令牌,其他默认
测试推送
进入刚才新建的web钩子,测试推送
不过这里有个问题,这个链接在不同的服务器上使用是没有问题的,但是如果gitea和Jenkins运行在同一台服务器上会请求失败报403错误:HTTP ERROR 403 No valid crumb was included in the request
这是因为Jenkins的跨域问题。不过自2.204.6版本开始,Jenkins就删除了禁用跨站请求伪造保护的功能,现在需要添加凭证到请求中才可访问
进入jenkins个人设置 -> API Token,生成新token并复制
重新配置web钩子,新模式如下:jenkinsID(登录名):token@Jenkins访问地址/job/Jenkins项目名/build?token=Jenkins项目中配置的身份验证令牌
测试推送,成功
方案二、使用Gitea插件,自动生成webhook(推荐)
安装插件
进入系统管理 -> 插件管理,安装gitea插件并重启
配置Gitea服务
进入系统管理 -> 系统配置 -> Gitea Server,新增gitea服务。设置名称和gitea的访问地址,勾选Manage hooks让gitea服务自动帮你在项目新增web钩子
添加凭证推荐用gitea管理员的token, 在gitea的个人设置 -> 应用里生成令牌(token),凭证添加范围选择系统
创建组织和生成“jenkins”token
使用管理员账户登录gitea,创建组织
进入管理后台 -> 账户管理,创建用户名为“jenkins”的账户(该号专门用于生成token)并添加到刚才创建的组织中
退出gitea,用“Jenkins”账号登录,进入个人设置 -> 应用,生成token并复制
新建jenkins任务
新建任务,类型选择Gitea Organization
配置Projects -> Gitea Organization,添加凭证,范围选该项目,使用刚才“jenkins”账户生成的token。Owner组织名称需要和gitea的组织名一致,保存
因为还未在组织创建仓库,所以扫描出来的存储库为0
创建gitea项目
拥有者选刚才创建的组织,其他默认
用SSH拉取该项目,在根目录创建名为Jenkinsfile的脚本文件,添加脚本示例:
1 | // Jenkinsfile |
Gitea Organization就是靠Jenkinsfile文件来识别项目。推送完毕后,在Jenkins的组织文件夹(刚才新建的任务)内会生成同名项目,在gitea的项目设置里,也会自动生成webhook
测试推送
成功
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