在实际开发中,我们经常需要将代码自动部署到运行中的容器中,尤其是在使用 Jenkins 做持续集成的场景里。本篇文章介绍如何通过 Jenkins 脚本,将 Webman 项目部署到一个基于 Alpine 的 Docker 容器中。
🚀 背景
我们有一个使用 Webman 框架开发的 PHP 项目,部署在名为 webman-admin-php82
的容器中。代码托管在 Gitea 中,Jenkins 通过 SSH 拉取代码并部署。
🧩 拉取代码
方式一:使用 Gitea 用户名 + 密码 / Token(推荐)
最简单稳定的方式,适用于 HTTP/HTTPS 仓库地址。
步骤 1:生成 Gitea 访问 Token
- 登录 Gitea
- 点击右上角头像 → Settings(设置)
- 左侧菜单选择:Applications
- 点击 Generate Token
- 输入名称,如:
jenkins-ci
- 生成后,复制 Token,保存好(只显示一次)
步骤 2:在 Jenkins 中添加 Gitea 凭据
- 打开 Jenkins → Manage Jenkins → Credentials
- 找到 (global) → 点击 Add Credentials
- 类型选择:Username with password
- 配置如下:
- Username:你在 Gitea 的用户名
- Password:刚才生成的 Token
- ID/Description:比如
gitea-token
- 保存
步骤 3:在 Jenkins Job 中使用 Gitea 凭据
如果是 Freestyle Job:
- 源码管理 → Git Repository
- Repository URL:
http://your-gitea-host:3000/youruser/yourrepo.git
- Credentials: 选择刚刚添加的
gitea-token
方式二:使用 SSH 密钥对(适用于 Git over SSH)
适合高安全性或你偏好 SSH 的场景。
步骤 1:在 Jenkins 生成 SSH 公私钥对
在 Jenkins 容器或宿主机执行:
|
|
保存为 /var/jenkins_home/.ssh/id_rsa
(或你自定义路径)
步骤 2:将公钥添加到 Gitea 用户的 SSH Key
- 登录 Gitea
- 点击头像 → Settings → SSH Keys
- 添加新 Key,粘贴 Jenkins 的
id_rsa.pub
内容
步骤 3:在 Jenkins 添加 SSH 凭据
- Jenkins → Manage Jenkins → Credentials → (global) → Add Credentials
- 类型选择:SSH Username with Private Key
- 配置:
- Username:
git
(Gitea 默认的 SSH 用户名) - Private Key: 粘贴
id_rsa
内容(私钥) - ID:
gitea-ssh
- Username:
步骤 4:配置 Jenkins Job 使用 SSH 拉仓库
- Git URL 示例:
git@your-gitea-host:youruser/yourrepo.git
- 凭据:选择
gitea-ssh
🧩 构建脚本
|
|
📝 脚本说明
变量定义
BUILD_DIR=$WORKSPACE
:Jenkins 工作空间目录DEPLOY_DIR=/var/www/wms
:容器内的部署目录CONTAINER_NAME=webman-admin-php82
:目标容器名称
部署流程
- 同步代码:使用
docker cp
将构建目录的所有文件复制到容器内 - 安装依赖:在容器内执行
composer install --no-dev -o
安装生产环境依赖 - 重启服务:停止并重新启动 Webman 服务
关键参数说明
--no-dev
:不安装开发依赖-o
:优化自动加载器-d
:以守护进程模式启动
🔧 注意事项
- 容器状态:确保目标容器
webman-admin-php82
正在运行 - 权限问题:Jenkins 需要有执行 Docker 命令的权限
- 目录权限:确保容器内的部署目录有正确的读写权限
- 服务依赖:如果项目依赖数据库等服务,确保这些服务已启动
🚨 故障排除
常见问题
-
容器不存在
1
Error: No such container: webman-admin-php82
解决:检查容器名称是否正确,容器是否正在运行
-
权限被拒绝
1
permission denied while trying to connect to the Docker daemon socket
解决:将 Jenkins 用户添加到 docker 组
-
Composer 安装失败
1
composer install failed
解决:检查网络连接,或配置 Composer 镜像源
调试技巧
- 在脚本中添加更多
echo
语句来跟踪执行进度 - 使用
docker logs $CONTAINER_NAME
查看容器日志 - 临时移除
set -e
来继续执行后续命令进行调试