Skip to content

CICD

代码仓库 gitea

没有用 gitlab,那个太吃资源了。

直到某天无聊翻群晖的应用市场,看到了 gitea,我才开始有属于自己的 git 仓库。所以我的 gitea 是在群晖应用市场安装的,没有装在 k8s 集群内(当然,它的官方文档里有关于在 k8s 集群里安装的方法)。

对于没有安装在 k8s 集群内的应用,为了能享受到集群里全自动 https 的福利,专门在集群里启了个 nginx 做代理。cicd 相关的服务也很需要 https,不然要到处配置允许访问 http 的服务。

nginx 相关配置
client_max_body_size 1G;
large_client_header_buffers 4 16k;

gzip on;
gzip_min_length 1k;
gzip_vary on;
# gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/html text/css text/javascript application/javascript application/json text/xml application/xml application/xml+rss image/svg+xml application/font-sfnt;

server {
    listen 80;
    server_name git.apihub.net;
    if ($http_user_agent ~* "bot|facebook") {
        return 403;
    }
    location /robots.txt {
        return 200 'User-agent: *\nDisallow: /';
    }
    location / {
        proxy_pass http://10.168.1.100:8418;
        
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
server {
    listen 80;
    server_name hb.apihub.net;
    location /v2/ {
        proxy_pass http://10.168.1.100:15000;
    }
    location / {
        proxy_pass http://hb-web:8080;
    }
}
server {
    listen 80;
    server_name mirrors.apihub.net;
    location / {
        proxy_pass http://10.168.1.100:8081;
    }
}

软件源 nexus3

nexus3 不止是 mvn 的镜子仓库,也可以做 npm、pypi 的加速。推荐 B站上的这个up主 的视频,里面有个 nexus3 系列。

这种 重网络和存储、轻计算、还只是内网访问自己一个人用的 应用,我也没有部署在集群里,安装到 群晖 docker 里了。

好的习惯,肯定要把 docker hub + github 里的介绍说明完整看一遍再动手。注意下面这个权限问题。

容器仓库 docker-registry

没有用 harbor。我只是要推拉一下镜像而已。同样是 重网络和存储、轻计算、一个人用 的应用。registry 安装到了 群晖 docker 里。

后来给它配了一个 web 页面,用的 klausmeyer/docker-registry-browser

打包构建 buildkit

没有用 jekins。它是一个功能很庞大的软件。HomeLab 场景下,没有运维团队帮忙,“点一下就构建完成”的背后,感觉需要巨量的运维领域知识的学习成本,很不值得。

HomeLab 场景下,也没有团队协作的负担。我用的 docker 底层的镜像构建工具 buildkit。用 Dockerfile 和 Makefile 实现一个命令行完成打包构建并推送容器镜像。可以复用很多开发岗已有的知识储备。

k8s 里部署 buildkitd

sh
# 容器镜像
moby/buildkit:master

# 参数
--addr tcp://0.0.0.0:1234

# 容器安全上下文
privileged=true

# service 开放端口
1234

不用挂载持久化存储。没事别瞎搞服务器,就一年都不会被重启一次。构建过程中的缓存文件,直接让容器重启后丢失就行了,有 nexus3 内网软件源的加速,已经很快了。

使用 buildkitd

首先,需要写一个 Dockerfile,比如:

Dockerfile
# 使用一个基础镜像
FROM hb.apihub.net/nginx:stable

COPY nginx.conf.template /etc/nginx/templates/default.conf.template

# 将当前目录下的所有文件复制到镜像的指定路径
COPY ./dist /usr/share/nginx/html

# 暴露容器的端口
EXPOSE 80

# 启动Nginx服务器
CMD ["nginx", "-g", "daemon off;"]

然后,要有个 Makefile:

Makefile
build: 
	npm run docs:build
	
	buildctl \
	--addr tcp://buildkitd.cicd.svc.cluster.local:1234 \
	build \
	--frontend dockerfile.v0 \
	--local context=. \
	--local dockerfile=. \
	--output type=image,name=hb.apihub.net/feling.net/pages:1.0.0,push=true

最后,运行 make build 命令就行了。

上面的例子中,make build 先执行了 npm run docs:build 命令,对一个前端项目进行构建,然后 buildctl 命令负责请求集群内的 buildkitd 服务执行 打包构建并推送镜像。

当然不止这一种写法,可以把整个流程都写到 Dockerfile 里。FROM node:22 as builderRUN git clone xxx、再 FROM nginx:stableCOPY --from=builder xx xx

我们需要深入掌握的,只有各种类型项目 Dockerfile 的写法,这可以是研发应具备的技能。Makefile 和 buildctl 命令,都只需要几分钟的时间入门,甚至看完上面那个 Makefile 的例子,就已经入门完了。

todo

buildkitd 实例内部,支持翻墙。FROM hb.apihub.net/nginx:stable 为什么是 hb.apihub.net,因为目前拉不到 docker hub 的镜像。