CICD-docker+jenkins
由于我博客项目只是自己的技术积累,更新不会及其频繁,所以一直都是手动部署
最近得空索性整个基于docker+jenkins的CI/CD自动化吧
步骤
- 安装Docker
- 安装配置Jekens
前期准备
本人项目部署在阿里云独立服务器
- 先运行命令
sudo dnf update -y
升级下系统吧,毕竟接下来的安装包基本都默认下载最新版本的 - 我一直用的Linux版本是CentOS的, 2021年12月31日开始停止支持并开始不再发布新版了,所以我转向了AlmaLinux. 因为他们都是Red Hat(红帽)系的所以可以安装RHEL操作系统的操作软件, 比如我是AlmaLinux9版本的系统那我就选了RHEL版本的Docker安装页面下的RHEL 9以下相关指令
安装Java
访问Oracle Java下载页面来查找并下载最新或特定版本的Java安装包,
lscpu
可以查询CPU型号, 方便你找到对应的安装包切换到服务器的/opt目录, 并上传刚才下载的java安装包至此
比如我的执行
sudo rpm -Uvh jdk-21_linux-x64_bin.rpm
进行安装配置环境变量执行
sudo nano /etc/profile
(当然你也可以使用vi、vim编辑器)在文件末尾添加以下内容(假设Java安装在
/usr/java/jdk-21
(默认)目录下,你需要根据实际情况调整路径):export JAVA_HOME=/usr/java/jdk-21 export PATH=$JAVA_HOME/bin:$PATH
验证Java是否安装成功并正确配置, 执行
java -version
安装Docker
- 添加Docker官方仓库到你的系统中
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker核心组件
sudo dnf install docker-ce docker-ce-cli containerd.io
- 检查Docker是否安装成功
docker --version
- 启动Docker服务
sudo systemctl start docker
- 设置Docker开机自启
sudo systemctl enable docker
- (可选)配置Docker镜像加速
- 为了加速Docker的下载速度,您可以配置Docker的镜像加速。创建或编辑执行
nano /etc/docker/daemon.json
,添加如下内容(实测如果添加"https://mirrors.aliyun.com"则不可用): { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.imgdb.de", "https://docker-0.unsee.tech", "https://docker.hlmirror.com", "https://docker.1ms.run", "https://func.ink", "https://lispy.org", "https://docker.xiaogenban1993.com" ] }
- 然后重新加载配置并重启Docker服务:
sudo systemctl daemon-reload
,sudo systemctl restart docker
- 执行
docker info
可以再最下方看到打印配置成功
- 为了加速Docker的下载速度,您可以配置Docker的镜像加速。创建或编辑执行
在Docker里安装Jenkins
安装步骤
注意事项
宿主机映射添加
注意:
上方安装步骤
最后一步需要通过--volume `参数增加宿主机和容器内部之间的路径映射, 否则,在容器内无法获取到宿主机的真实路径.后果是: 在宿主机运行jenkins构建之后, 再通过执行
cp
复制构建产物到宿主机无法实现当然还有后期补救措施:
停止并删除原容器, 执行以下命令
# 停止容器 docker stop jenkins-blueocean # 删除容器(原有 Volume 数据会保留) docker rm jenkins-blueocean
在原命令基础上增加新的
--volume
参数,例如添加宿主机/data/maven
映射到容器内/mnt/maven
:
docker run --name jenkins-blueocean --restart=on-failure --detach \ --network jenkins --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \ --publish 8080:8080 --publish 50000:50000 \ --volume jenkins-data:/var/jenkins_home \ --volume jenkins-docker-certs:/certs/client:ro \ --volume /path/to:/path/to \ # 新增的 Volume 映射 myjenkins-blueocean:2.492.1-1
限制docker资源(内存/CPU)占用量
比如我限制内存512MB(反复尝试新版本docker的最小内存占用量),这样就可以跑着2GB内存的服务器上了, 小于512MB就会被杀进程
两种方法二选一
启动时
同样的,需要在执行
docker run
时增加限制性参数docker run --name jenkins-blueocean # 注释 .....省略展示中间参数..... --memory=512m \ # 注释 限制内存最大512MB --cpus=1.5 \ # 注释 限制cpu使用1.5个内核 myjenkins-blueocean:2.492.1-1 # 注释 <container_id_or_name>
如果已经启动了可以选择更新参数
docker update --memory=512m --cpus=1.5 <container_id_or_name> # 注释 限制内存最大512MB 限制cpu使用1.5个内核
垃圾清理
docker system prune -a # 注释 会删除所有未使用的容器、网络、镜像和缓存,用之前三思!
防火墙
老系统要查看哪些端口被开放,你可以使用以下命令:
sudo iptables -L -n --line-numbers | grep 'ACCEPT'
新系统执行以下命令
firewall-cmd --zone=public --add-port=8080/tcp --permanent systemctl restart firewalld firewall-cmd --zone=public --list-ports
云服务器也要放开安全组对应的端口
Jenkins初始化
- 找到初始密码
- 通过docker可以通过执行
docker logs [启动docker时的名称]
检索出初始密码- 最后我的路径:
/var/lib/docker/volumes/jenkins-data/_data/secrets/initialAdminPassword
- 最后我的路径:
- 如果没安装docker,直接安装了Jenkins, 那执行
cat /var/lib/jenkins/secrets/initialAdminPassword
或根据页面提示查看密码 - 进入插件安装页面,暂时安装系统推荐插件即可。
- 至此 Jenkins 安装就算完成了。
- 通过docker可以通过执行
Jenkins使用
安装插件
- 系统管理 -> 插件管理 -> Available plugins
必选插件
前端项目的打包需要 node 环境,
NodeJS
安装NodeJS插件: Dashboard > 系统管理 > 插件管理
配置NodeJS版本、软件源、pnpm(提前在宿主机安装+建立公共包缓存路径,不再赘述看官方文档): Dashboard > 系统管理 > 全局工具配置
再次配置软件源(http://registry.npmmirror.com): Dashboard > 系统管理 > Managed files
进入后选择左侧的
Add a new Config
,然后选择Npm config file
,然后点击Next
。
可选插件
Publish Over SSH: 通过ssh远程将构建产物发布到目标服务器
打开 系统管理 -> 系统配置 -> Publish over SSH (在最下面), 按字段填写节课:
设置好可以通过
Test Configuration
按钮,测试 SSH 连通性打开 你的任务 -> 配置 -> 构建后操作 -> Add Server新增一个SSH服务
Copy Artifact: 启动新任务拷贝上一个任务的产物到当前宿主机的某一路径
- 如果当前宿主机已经有了对的路径映射, 则不需要本插件, 直接在任务里执行shell
cp -r /path/to/* /path/target
即可
通知类插件: 通知到各通讯
新建任务
选择
构建一个自由风格的软件项目
,点击确定。配置git仓库, 以笔者的github仓库为例(https/ssh两种方式二选一):
源码管理 > 这里选择 Git:
方式1: HTTPS(不推荐):
- 不推荐的原因是中国大陆网络限制会导致拉取仓库是经常报错:
:refs/remotes/origin/*" returned status code 128:…
- 输入仓库地址(Repository URL):https://github.com/xxx/xxx.git
- 由于笔者这是一个私有仓库,因此会标红提醒。在下面的
Credentials
中,添加一个: - 注意,这里的用户名是 Github 用户名,但是密码不是你的 Github 密码,而是你的 Github Access Token!!!,请在Github Settings > Developer Settings > Personal access tokens > 创建 Fine-grained personal access tokens
- 不推荐的原因是中国大陆网络限制会导致拉取仓库是经常报错:
方式2: SSH(推荐)
- 方法同上, 区别点如下:
在jenkins系统之外生成ssh密钥对<公钥+私钥>,生成教程简单请自查,公钥上传github、私钥上传到jenkins
- 输入仓库地址(Repository URL):git@github.com:xxx/xxx.git
在下面的
Credentials
中,添加一个:需要配置私钥的验证方式
要不然拉取git仓库是又要报错
stdout: stderr: No ED25519 host key is known for github.com and you have requested strict checking.Host key verification failed.
Dashboard > 系统管理 > 全局安全配置 > Git Host Key Verification Configuration > Host Key Verification Strategy > Accept first connection
- Known hosts file (默认) 严格匹配
~/.ssh/known_hosts
文件中的主机密钥记录,拒绝任何未记录或变更的密钥。 - Accept first connection(推荐) 首次连接自动将主机密钥写入
known_hosts
,后续连接强制校验历史记录。 - Manually provided keys 完全依赖用户预设的静态密钥列表,忽略 `known_hosts
- No verification (不推荐) 跳过所有密钥验证,直接建立连接
- Known hosts file (默认) 严格匹配
构建触发器
- 勾选
GitHub hook trigger for GITScm polling
,这样在 Git 仓库产生提交时,就会触发构建,属于是真正的核心。
- 勾选
Webhooks
- 与Jenkins构建触发器对应的, 还需要去Github里增加Webhook钩子。
- 目前虽然构建成功了,但是需要手动点击构建,接下来实现如何将代码提交 Git 后自动触发构建。打开仓库设置 -> Webhooks 添加一个:
- jenkins里也需要开启:
Build Steps
到这里,可以理解为 Jenkins 已经将仓库克隆到本地,并且已经安装好了
node
、npm
、pnpm
,接下来就是执行命令在执行shell中添加命令:
node -v pnpm -v pnpm i pnpm build rm -rf /path/target/* cp -r ./dist/* /path/target
复制任务
- 当你已经创建了任务并且手动配置了很多参数后, 又想基于此复制份新的任务(略作修改) --> 使用场景举例: A任务构建后产物传到远程服务器, B任务构建后产物复制到本地服务器其他路径
- 具体步骤:
总结
- 至此,Gitlab 提交代码后自动打包并部署至服务器的流水线就完成了。
- 适合小公司的小型项目或自己的演示项目,大公司一定会有更规范更细节的流程。