威联通 NAS 安装 GitLab + GitLab Runner 实现自动打包生成 apk 文件
本文最后更新于:5 天前
缘起
QNAP 中 Container Station 推荐的 GitLab 版本一直没有升级,现在比较低了,想升级一下 GitLab 的版本,再实现 Android 项目自动打包生成 apk 文件的功能。
安装 GitLab
Container Station 推荐的 GitLab 版本是 11.4.0:
GitLab 截至目前的最新版本是 16.8.0:
https://gitlab.com/gitlab-org/gitlab-foss/-/tags
Docker 中的版本是 16.8.0-ce.0:
https://hub.docker.com/r/gitlab/gitlab-ce/tags
第1个坑:Container Station 无法下载安装 gitlab/gitlab-ce
解决第1个坑
方法1:使用 Portainer 安装 GitLab
Portainer 的本质是安装 Docker 的工具。
安装 Portainer 以后方便切换版本,后续升级的时候先看一下官方文档是否有特殊说明,如果没有的话就直接切换成新版本就可以了。
方法2:直接使用 Docker 安装 GitLab
使用【方法1】解决第1个坑
第2个坑:Container Station 无法下载安装 portainer/portainer-ce
解决第2个坑:使用 Docker 安装 Portainer
下载并安装 Xshell
https://www.xshell.com/zh/free-for-home-school/
打开 NAS 的 SSH
新建会话
输入用户名密码,连接。
退出 menu
输入q
输入y
使用 Docker 安装 Portainer
Portainer 截至目前的最新版本是 2.19:
https://docs.portainer.io/start/install-ce/server/docker/linux
Docker 中的版本是 2.19.4:
https://hub.docker.com/r/portainer/portainer-ce/tags
在 NAS 中创建一个文件夹:
这个文件夹的路径是:
/share/Container/Docker/portainer_data
执行命令:
1 |
|
这里因为 9000
端口我给 leanote 用了,所以改为了 19000
(冒号前面的值替换冒号后面的值)。
使用 -v
将宿主机的目录挂载到容器中,以避免以后可能出现的权限问题。
安装完成后可以看到镜像文件已下载,并且 portainer 已经运行中了,portainer_data 文件夹中也有了文件:
打开 Portainer
首次使用需要注册 admin
账号:
可以看到已安装的 container:
解决第1个坑:使用 Portainer 安装 Gitlab
使用【方法2】解决第1个坑
https://docs.gitlab.com/ee/install/docker.html
在 NAS 中创建文件夹
文件夹的路径是:
/share/Container/Docker/gitlab/data
/share/Container/Docker/gitlab/logs
/share/Container/Docker/gitlab/config
使用 Docker 安装 GitLab
执行命令:
1 |
|
安装完成后可以看到镜像文件已下载,并且 gitlab 已经运行中了,gitlab 中的各个文件夹中也有了文件:
如果 CPU 占用很高,就是还没启动完成。
查看 root 账号的初始密码
执行命令:
1 |
|
查看 GitLab 运行状态
使用 Portainer 可以查看 GitLab 是否已经启动完成:
启动完成后打开 GitLab
clone 代码
创建初始化了 README 的空项目
第3个坑:clone 代码的 git 链接不正确
解决第3个坑:修改 gitlab.rb + 设置链接
针对 ssh,修改 gitlab.rb
1 |
|
重启 GitLab 后生效:
针对 http,设置链接
这里可以打开 HTTP,并设置链接,不需要重启:
git 链接
ssh://[email protected]:20022/test/runner-demo.git
http://192.168.50.124:20080/test/runner-demo.git
测试 clone 代码
添加 SSH key 到 GitLab
文件夹路径:C:\Users\Administrator\.ssh\
在 GitLab 中创建用户并授权
clone 代码
安装 GitLab Runner
GitLab Runner 截至目前的最新版本是 16.8:
https://docs.gitlab.com/runner/install/docker.html
Docker 中的版本是 v16.8.0:
https://hub.docker.com/r/gitlab/gitlab-runner/tags?page=2
使用 Docker 安装 GitLab Runner
https://docs.gitlab.com/runner/install/docker.html
自定义 volume 文件夹名
执行命令:
1 |
|
查看 volume 文件夹地址
执行命令:
1 |
|
地址是:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/gitlab-runner/_data
在 NAS 中创建文件夹
下载并安装 GitLab Runner
执行命令:
1 |
|
安装完成后可以看到镜像文件已下载,并且 gitlab-runner 已经运行中了,_data 文件夹中也有了文件:
容易出错的地方
在【下载并安装 GitLab Runner】时想直接像安装 GitLab 时一样/share/Container/Docker/gitlab-runner:/etc/gitlab-runner
就会失败,这个地方只能使用【创建 volume】。
验证是否安装失败
执行命令:
1 |
|
这是正确的。
如果有报错:
1 |
|
就是安装失败了。
这里的报错信息不准确,实际加载的文件是上面自定义文件名的 volume 中的 config.toml:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/gitlab-runner/_data/config.toml
注册 runner 并执行 pipeline
准备代码
选择一个 build Android .apk 的 Docker Image
mobiledevops/android-sdk-image
https://hub.docker.com/r/mobiledevops/android-sdk-image
最新版本是:34.0.0-jdk17
下载 demo 并上传到 GitLab
demo 下载地址:
https://gitlab.com/MobileDevOps/android-ci-demo
下载到本地:
看一下 runner 用的 .gitlab-ci.yml 文件:
1 |
|
tag 是 shared
。
修改版本为 34.0.0-jdk17。
上传到 GitLab:
注册 runner(通过 GitLab 生成 token)
会报错:无法访问此网站
把端口号手动加上就可以了:
token:glrt-dNcto3isyApqxZqWxzUC
第4个坑:gitlab-runner 命令找不到
执行命令:
1 |
|
会报错:
1 |
|
解决第4个坑
方法1:在 Container Station 中的 gitlab-runner 执行
gitlab-runner
命令是在 Docker 容器中执行的。
方法2:使用 docker run 执行
命令的 gitlab-runner
由 docker run [docker options] gitlab/gitlab-runner
替代,剩余部分保持与注册文档中描述的内容相一致。
执行命令:
1 |
|
configuration 实际存储文件的位置是上面自定义的 volume:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/gitlab-runner/_data
1 |
|
图中上面的 [[runners]]
是之前通过 registration token
注册的 runner。
【deprecated】注册 runner(通过 registration token)
registration token:GR1348941e2aaEee8stBszk5iuLri
执行命令:
1 |
|
注册完成
注册完成后自动下载了两个 docker image:
registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v16.8.0
mobiledevops/android-sdk-image:34.0.0-jdk17
执行 pipeline
当代码没有进过 pipeline,且 runner 刚创建时,会自动触发一次 runner;
如果代码已经进过 pipeline,修改一下代码,也会触发 runner。
第5个坑:pipeline 运行 failed
1 |
|
解决第5个坑:修改 gradlew 的权限
执行命令:
1 |
|
修改完后需要提交代码。
第6个坑:下载 gradle 失败
1 |
|
解决第6个坑:修改代码仓库为国内镜像
路由器没有配置翻墙,只能修改代码仓库为国内镜像了。
aliyun:https://developer.aliyun.com/mvn/view
第7个坑:gradle 版本过低
1 |
|
解决第7个坑:用 IDE 打开 demo,确保 demo 在本地不翻墙的条件下能跑起来
执行完成
打包的 .apk 文件在最近一次的 volume 里,地址是:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/runner-6ywyazrq7-project-3-concurrent-0-cache-c33bcaa1fd2c77edfc3893b41966cea8/_data/test/android-ci-demo/app/build/outputs/apk/release/app-release-unsigned.apk