本文更多的是对之前gitlab部署的补充,单机环境不会涉及k8s滚动部署之流
测试环境:局域网测试服务器(1台)
生产环境:阿里云生产服务器(1台)
在局域网的服务器中用gitlab存储代码,以及运行了gitlab runner用来执行ci脚本
局域网中部署gitlab,在上面提交代码
主分支策略:仓库只保留主干,其他非核心开发者只能分出新分支,当新功能完成后,上传代码请提出合并请求(PR)
多分支策略:在主分支策略的基础上开几个新的分支,可能是专门用于测试环境的分支(测试完成后合并到master),可能是release分支(大版本更新的分支),可能是对一些大型功能进行重构的分支,可能是专门用来解决bug的分支…
可以使用 Checkstyle,ESLint 等规范代码风格
用 Husky 等工具使用 git hook
如果是规范
git commit
信息,可以直接在.git/hooks/commit-msg
中写入#!/bin/sh # 提交信息格式正则表达式 commit_regex='^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-z0-9_-]+\))?: .{1,50}$' # 读取提交信息 commit_message=$(cat "$1") # 检查提交信息是否符合正则表达式 if ! echo "$commit_message" | grep -Eq "$commit_regex"; then echo "Error: Invalid commit message format." echo "Proper commit message format is required for automated changelog generation." echo "Examples: " echo " feat(module): add a new feature" echo " fix(module): fix a bug" exit 1 fi
这样,如果
git commit
信息不符合规范就会无法提交
根据gitlab ci脚本可以选择不同的策略:
单服务器,以何种方式进行部署更合适?
蓝绿部署还有一种,是直接切软链接,但我觉得不太靠谱(强制停机软链接可能会丢失,但其他的问题我就不清楚了)
复杂的项目限制,我在实践中选择了蓝绿部署
其他的滚动部署,金丝雀部署等方式不适用单机环境
docker的开启和关闭是需要时间的,缓存的上传和下载也是需要时间的,这时候为了减少时间可以专门开一个构建用的docker,把环境弄好,构建的时候用ssh执行器直接连接,这样依赖无需下载也无需docker开启关闭的时间
我之前写的就是ci太慢了,部署springboot项目,maven构建好了,那么又把构件移到rsync的docker里发往远程服务器,这不是浪费了相当多时间吗
可能需要安装的:
可以考虑用nvm
,mise
这种版本切换工具来切换不同环境,且这种工具一般是无需root权限的,是用户级别的命令
大部分此类工具在非交互式shell里和一般的操作是不一样的,例如非交互式shell里直接使用
nvm
是不行的,需要先source ~/.bashrc
一下
当然,也可以自行编写dockerfile
单个作业脚本中添加:
variables:
GIT_STRATEGY: none
only:
refs:
- /^prod-.*$/
variables:
- $CI_COMMIT_REF_NAME == "master"
stage: build
variables: {} # 可以用来跳过单个作业中的全局变量
script:
- |
git checkout $COMMIT_SHA
echo "COMMIT_SHA: $COMMIT_SHA"
点入作业,可以手动修改变量(覆盖变量)后提交
script:
rsync -av ~/A/ devops@$PROD_SERVER:/home/devops/cache/
rsync
rsync -av --chmod=755 --exclude '.git' ~/A/ devops@$PROD_SERVER:/home/devops/cache/
rsync -av --chmod=755 ~/A/ devops@$PROD_SERVER:/home/devops/cache/
.
和..
的权限也同步,所以需要加上 --no-implied-dirs
: rsync -av --no-implied-dirs ~/A/ devops@$PROD_SERVER:/home/devops/cache/
可以考虑,当依赖文件发生变化才安装依赖
可以使用 git diff
查询本次提交和上次的提交有什么区别,如果以下文件不一样就构建
有时可以考虑并行执行任务
build_source m-source m &
build_source n-source n &
wait
node依赖,maven依赖等
cache:
key: "XXX_CACHE"
paths:
- node_modules
普通不加key的缓存不能跨pipelines
部分执行器是不支持缓存的,例如ssh执行器(但是ssh执行器本身就不需要缓存)
可以考虑用docker_image_pusher转成国内的镜像
单独开一个容器进行:
优点:
缺点:
其实在测试环境开一个新用户,在里面直接安装需要的工具并构建,也是可行的,但就是没有与主机隔离就是了
可以使用docker的替代品podman代替docker操作,命令几乎完全一样
解决办法:
重复构建相同名称相同标签相同的容器,会造成悬空镜像(可以用时间戳随机生成来打标签,防止生成悬空镜像)
修改dockerfile时旧的镜像层次可能会变成悬空镜像
手动清理空间步骤:
查看命令:
# 查看docker网络
docker network ls
# 查看容器卷
docker volume ls
# 查看容器镜像
docker image ls
## 或者
docker images
# 查看悬空镜像
docker image ls -f dangling=true
# 查看所有悬空卷:
docker volume ls -f dangling=true
# 查看未使用镜像
docker image prune -a --filter "until=24h"
删除命令:
# 删除镜像
docker rmi mh-go
# 删除所有悬空镜像
docker image prune
# 删除所有悬空卷
docker volume prune
# 删除所有未使用的 Docker 对象(包括停止的容器,未使用的网络,悬空镜像和未使用的镜像,构建缓存,不包括悬空卷)
docker system prune -a