威联通 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
docker run -d -p 8000:8000 -p 9443:9443 -p 19000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /share/Container/Docker/portainer_data:/data portainer/portainer-ce:2.19.4

这里因为 9000 端口我给 leanote 用了,所以改为了 19000(冒号前面的值替换冒号后面的值)。
使用 -v 将宿主机的目录挂载到容器中,以避免以后可能出现的权限问题。

安装完成后可以看到镜像文件已下载,并且 portainer 已经运行中了,portainer_data 文件夹中也有了文件:

打开 Portainer

http://192.168.50.124:19000/

首次使用需要注册 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
2
3
4
5
6
7
8
9
10
sudo docker run --detach \
--hostname 192.168.50.124 \
--publish 20443:443 --publish 20080:80 --publish 20022:22 \
--name gitlab \
--restart always \
--volume /share/Container/Docker/gitlab/config:/etc/gitlab \
--volume /share/Container/Docker/gitlab/logs:/var/log/gitlab \
--volume /share/Container/Docker/gitlab/data:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ce:16.8.0-ce.0

安装完成后可以看到镜像文件已下载,并且 gitlab 已经运行中了,gitlab 中的各个文件夹中也有了文件:


如果 CPU 占用很高,就是还没启动完成。

查看 root 账号的初始密码

执行命令:

1
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

查看 GitLab 运行状态

使用 Portainer 可以查看 GitLab 是否已经启动完成:

启动完成后打开 GitLab

http://192.168.50.124:20080/

clone 代码

创建初始化了 README 的空项目

第3个坑:clone 代码的 git 链接不正确

解决第3个坑:修改 gitlab.rb + 设置链接

针对 ssh,修改 gitlab.rb

1
gitlab_rails['gitlab_shell_ssh_port'] = 20022

重启 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
sudo docker volume create gitlab-runner

查看 volume 文件夹地址

执行命令:

1
docker volume inspect gitlab-runner


地址是:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/gitlab-runner/_data

在 NAS 中创建文件夹

下载并安装 GitLab Runner

执行命令:

1
2
3
4
sudo docker run -d --name gitlab-runner --restart always \
-v gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:v16.8.0

安装完成后可以看到镜像文件已下载,并且 gitlab-runner 已经运行中了,_data 文件夹中也有了文件:

容易出错的地方

在【下载并安装 GitLab Runner】时想直接像安装 GitLab 时一样/share/Container/Docker/gitlab-runner:/etc/gitlab-runner就会失败,这个地方只能使用【创建 volume】。

验证是否安装失败

执行命令:

1
docker logs gitlab-runner


这是正确的。

如果有报错:

1
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory  builds=0

就是安装失败了。
这里的报错信息不准确,实际加载的文件是上面自定义文件名的 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
2
3
4
5
6
7
8
9
10
image: mobiledevops/android-sdk-image:30.0.3
stages:
- build

release_build:
stage: build
tags:
- shared
script:
- ./gradlew clean assembleRelease

tag 是 shared
修改版本为 34.0.0-jdk17。

上传到 GitLab:

注册 runner(通过 GitLab 生成 token)

会报错:无法访问此网站

把端口号手动加上就可以了:

token:glrt-dNcto3isyApqxZqWxzUC

第4个坑:gitlab-runner 命令找不到

执行命令:

1
gitlab-runner register  --url http://192.168.50.124:20080  --token glrt-dNcto3isyApqxZqWxzUC

会报错:

1
-sh: gitlab-runner: command not found

解决第4个坑

方法1:在 Container Station 中的 gitlab-runner 执行

gitlab-runner 命令是在 Docker 容器中执行的。

方法2:使用 docker run 执行

命令的 gitlab-runnerdocker run [docker options] gitlab/gitlab-runner 替代,剩余部分保持与注册文档中描述的内容相一致。

执行命令:

1
2
3
4
5
6
7
docker run --rm -v gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:v16.8.0 register \
--non-interactive \
--executor "docker" \
--docker-image mobiledevops/android-sdk-image:34.0.0-jdk17 \
--url "http://192.168.50.124:20080/" \
--token "glrt-dNcto3isyApqxZqWxzUC" \
--description "docker-runner"

configuration 实际存储文件的位置是上面自定义的 volume:
/share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/gitlab-runner/_data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "docker-runner"
url = "http://192.168.50.124:20080/"
id = 5
token = "glrt-dNcto3isyApqxZqWxzUC"
token_obtained_at = 2024-01-23T08:24:29Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "mobiledevops/android-sdk-image:34.0.0-jdk17"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
network_mtu = 0

图中上面的 [[runners]]是之前通过 registration token注册的 runner。

【deprecated】注册 runner(通过 registration token)


registration token:GR1348941e2aaEee8stBszk5iuLri

执行命令:

1
2
3
4
5
6
7
8
9
10
docker run --rm -v gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:v16.8.0 register \
--non-interactive \
--executor "docker" \
--docker-image mobiledevops/android-sdk-image:34.0.0-jdk17 \
--url "http://192.168.50.124:20080/" \
--registration-token "GR1348941e2aaEee8stBszk5iuLri" \
--description "docker-runner" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"

注册完成

注册完成后自动下载了两个 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
2
/usr/bin/bash: line 138: ./gradlew: command not found
ERROR: Job failed: exit code 1

解决第5个坑:修改 gradlew 的权限

执行命令:

1
git update-index --chmod=+x gradlew

修改完后需要提交代码。

第6个坑:下载 gradle 失败

1
2
3
Downloading https://services.gradle.org/distributions/gradle-6.5-all.zip
Exception in thread "main" java.net.ConnectException: Connection timed out
ERROR: Job failed: exit code 1

解决第6个坑:修改代码仓库为国内镜像

路由器没有配置翻墙,只能修改代码仓库为国内镜像了。

aliyun:https://developer.aliyun.com/mvn/view

第7个坑:gradle 版本过低

1
2
3
4
5
6
7
8
9
FAILURE: Build failed with an exception.
* Where:
Settings file '/builds/test/android-ci-demo/settings.gradle'
* What went wrong:
Could not compile settings file '/builds/test/android-ci-demo/settings.gradle'.
> startup failed:
General error during semantic analysis: Unsupported class file major version 61

java.lang.IllegalArgumentException: Unsupported class file major version 61

解决第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


威联通 NAS 安装 GitLab + GitLab Runner 实现自动打包生成 apk 文件
https://weichao.io/6b7041ccc86d/
作者
魏超
发布于
2024年1月23日
更新于
2024年1月23日
许可协议