持续集成

Jenkins安装

1.安装 JDK21

2.安装 Jenkins 2.492.3

作为本地服务;端口 8080

3.打开 http://172.21.108.56:8080

b00acffa035946e18bb20924c6f77181

用户名:cc
密码:a5300066

重启服务: 在地址栏中输入:http://172.21.108.56:8080/restart/

配置所使用的节点:http://172.21.108.56:8080/manage/computer/

需要配置jenkins代理,否则会出现各种连接不到github的错误。 Manager Jenkins -> System Configuration -> System -> Http Proxy Configuration:

# 服务器
127.0.0.1
# 端口
7890

亚马逊云配置

进入 登录页面 ,使用Sign in using root user email,然后依次输入邮箱和密码。

安装 亚马逊云的命令行工具创建访问密钥

# 配置ID和访问密钥
aws configure
# 查看配置(可选)
aws configure list
# 下载文件
aws s3 cp s3://hutb/hutb.png .
# 上传文件
aws s3 cp Jenkinsfile s3://hutb/

(可能非必需)安装 AWS Credentials 插件,然后在设置中添加AWS Credentials。

在脚本中直接指定key_id和secret_access_key:

aws configure set aws_access_key_id XXX
aws configure set aws_secret_access_key XXX

Jenkins配置

这个是因为我使用的本地的git用来测试,所以需要配置一下,在 jenkins安装目录(默认是C:\Program Files\Jenkins)找到 jenkins.xml

1.在配置页面的流水线下的定义下拉菜单中选择Pipeline script from SCM (Software Configuration Management) 。 仓库配置为C:\ProgramData\Jenkins\.jenkins\workspace,并制定分支。

2.开始构建

默认克隆在C:\ProgramData\Jenkins\.jenkins\workspace目录下。

Gitlab 安装

Gitlab镜像拉取和安装

docker run -d -p 3000:80 twang2218/gitlab-ce-zh:11.1.4
配置(不适合中文版)
# 进入容器
docker exec -it gitlab bash

vi /etc/gitlab/gitlab.rb
#gitlab访问地址,可以写域名。如果端口不写的话默认为80端口
external_url 'http://172.21.108.56:9980' 
#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '172.21.108.56'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 9922

# 重新编译gitlab配置文件
gitlab-ctl reconfigure
# 重启gitlab服务
gitlab-ctl restart

#退出容器
exit
# 重启gitlab容器
docker restart gitlab

# 查看初始密码
docker exec -it gitlab cat /etc/gitlab/initial_root_password

访问:http://172.21.108.56:9980/

数据持久化参考 链接

问题:HTTP 502: Waiting for GitLab to boot

错误排查:

gitlab-ctl tail

虚幻引擎

根据UE4.sln找到对应的vs工程文件为Engine\Intermediate\ProjectFiles\UE4.vcxproj,得到构建虚幻引擎的命令为:

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" Engine\Intermediate\ProjectFiles\UE4.vcxproj

步骤同上,但是由于UnrealEngine是私有项目,在填写Repository URL时,需要带上github账户的Token,比如: https://{token}@github.com/OpenHUTB/UnrealEngine.git

拉取 中文版gitlab 镜像

https://hub.docker.com/r/twang2218/gitlab-ce-zh

git remote add hutb http://172.21.108.56:3000/root/UnrealEngine

注意

虚幻引擎编译命令参考 链接

gitlab提交代码触发Jenkins构建

1.Jenkins页面中,系统管理 -> 插件管理 -> 可选插件 -> 搜索要安装的插件(gitlab-plugin 和 Generic Webhook Trigger)

2.在 Jenkins 的项目(接收方)配置中勾选Generic Webhook Trigger (按 链接1链接2 中的说明进行设置):

2.1 在 Post content parameters 中定义 post 请求的变量。Variable 中的 Name of variable 设置为:ref(在构建过程中需要使用到的变量名;将匹配到的值,复制给 ref 变量),Expression设置为 $.ref(获取变量的值,匹配 gitlab 请求的参数),勾选 JSONPath

2.2 输入 Token(比如hutb-admin-dev),这个 token 在第 3 步中填写到 gitlab 的 webhook 链接的最后(防止其他人触发CICD),要保证在 Jenkins 中唯一;

2.3 Optional filter 中的 Expression为:^(refs/heads/dev)$ (匹配构建条件的正则表达式,这里的hutb是匹配的分支名,可根据实际的分支名情况修改),Text为:$ref (匹配的值,可使用上面配置的任意变量或组合,构建只有在此处的值与给定的正则匹配时才会触发)。

3.在Gitlab(请求方)的项目页面:设置->导入所有仓库->链接(URL) 中填入http://172.21.108.56:8080/generic-webhook-trigger/invoke?token=TOKEN (该token和上面第2.2步Jenkins->UnrealEngine->Configuration->Triggers->Token里一致),取消开启SSL证书验证,点击 Test-> Push events 来触发 Jeinkins 的构建。

添加钩子时报错:Urlis blocked: Requests to the local network are not allowed

原因:向同一台机器的IP发送请求不允许

解决:Gitlab主页中的工具栏中的扳手->设置->外发请求,勾选允许钩子和服务访问本地网络(注意不是项目的设置)

参考:

高级配置

轮询设置

默认不是东八区时间。 每隔2分钟执行一次查询,有更新就执行构建。

TZ=Asia/Shanghai
H/2 * * * *

Jenkins关闭静默期

提交通常会以突发的方式出现。这主要有两个原因:一是人们有时会忘记提交某些文件;二是人们在等待 SCM 完成提交的过程中,有时会意识到提交中的问题,并迅速进行后续修改。传统观点认为,CI 服务器应该等待突发提交完成后再尝试构建。据说这可以降低构建失败的风险,有时也有助于缩短构建时间较长的平均周转时间。

关闭静默期可以实现提交代码后立即开始编译:Manage Jenkins -> System -> 静默期 设置为0。

清除历史的构建的包

每次所构建的包位于存放的路径是jobs/JOB_NAME/builds/BUILD_NUMBER/archive,比如:C:\ProgramData\Jenkins\.jenkins\jobs\carla\builds,可能非常大,需要定时清除。

将运行中的gitlab容器打包为镜像

1.将运行中的Docker容器保存为镜像

# 容器ID使用 docker ps 查看
docker commit <容器ID或名称> <镜像名称>:<标签> 

2.将镜像保存为tar文件

docker save -o <tar文件名>.tar <镜像名称>:<标签>

3.将镜像tar文件复制到本地

docker load -i <tar文件名>.tar

配置构建失败时发送邮件

下载两个插件:Email Extension, Email Extension Template, 这两个插件可以帮助我们进行邮件的编写以及格式化。

在Jenkins的“设置->Account”中设置邮件地址,如“123456@qq.com”

在Jenkins的“Manage Jenkins -> System” 中的 Extended E-mail Notification

问题: org.eclipse.angus.mail.smtp.SMTPSenderFailedException: 501 Mail from address must be same as authorization user.

需要将Manage Jenkins —> System 中的 系统管理员邮件地址 要和邮件通知中的地址一致(123456@qq.com)。

问题:HTTP ERROR 403 No valid crumb was included in the request

Manage Jenkins -> Security中的跨站请求伪造保护中的启用代理兼容勾选。

其中的Test e-mail recipient为接收方邮箱地址(QQ邮箱为发送方)。open3d_lidar.py

Github Action 配置

UE4 发布工作流程需要手动触发,并且必须按照命名约定ue4/x.y.z在分支上执行。

参考