使用 Jenkins 和 Docker 部署 Webman 项目

在 Jenkins 中通过容器部署基于 Webman 框架的 PHP 项目。

在实际开发中,我们经常需要将代码自动部署到运行中的容器中,尤其是在使用 Jenkins 做持续集成的场景里。本篇文章介绍如何通过 Jenkins 脚本,将 Webman 项目部署到一个基于 Alpine 的 Docker 容器中。

🚀 背景

我们有一个使用 Webman 框架开发的 PHP 项目,部署在名为 webman-admin-php82 的容器中。代码托管在 Gitea 中,Jenkins 通过 SSH 拉取代码并部署。

🧩 拉取代码

方式一:使用 Gitea 用户名 + 密码 / Token(推荐)

最简单稳定的方式,适用于 HTTP/HTTPS 仓库地址。

步骤 1:生成 Gitea 访问 Token

  1. 登录 Gitea
  2. 点击右上角头像 → Settings(设置)
  3. 左侧菜单选择:Applications
  4. 点击 Generate Token
  5. 输入名称,如:jenkins-ci
  6. 生成后,复制 Token,保存好(只显示一次)

步骤 2:在 Jenkins 中添加 Gitea 凭据

  1. 打开 Jenkins → Manage JenkinsCredentials
  2. 找到 (global) → 点击 Add Credentials
  3. 类型选择:Username with password
  4. 配置如下:
    • Username:你在 Gitea 的用户名
    • Password:刚才生成的 Token
    • ID/Description:比如 gitea-token
  5. 保存

步骤 3:在 Jenkins Job 中使用 Gitea 凭据

如果是 Freestyle Job:

  1. 源码管理 → Git Repository
  2. Repository URL: http://your-gitea-host:3000/youruser/yourrepo.git
  3. Credentials: 选择刚刚添加的 gitea-token

方式二:使用 SSH 密钥对(适用于 Git over SSH)

适合高安全性或你偏好 SSH 的场景。

步骤 1:在 Jenkins 生成 SSH 公私钥对

在 Jenkins 容器或宿主机执行:

1
ssh-keygen -t rsa -b 4096 -C "jenkins@gitea"

保存为 /var/jenkins_home/.ssh/id_rsa(或你自定义路径)

步骤 2:将公钥添加到 Gitea 用户的 SSH Key

  1. 登录 Gitea
  2. 点击头像 → SettingsSSH Keys
  3. 添加新 Key,粘贴 Jenkins 的 id_rsa.pub 内容

步骤 3:在 Jenkins 添加 SSH 凭据

  1. Jenkins → Manage JenkinsCredentials(global)Add Credentials
  2. 类型选择:SSH Username with Private Key
  3. 配置:
    • Username: git(Gitea 默认的 SSH 用户名)
    • Private Key: 粘贴 id_rsa 内容(私钥)
    • ID: gitea-ssh

步骤 4:配置 Jenkins Job 使用 SSH 拉仓库

  • Git URL 示例git@your-gitea-host:youruser/yourrepo.git
  • 凭据:选择 gitea-ssh

🧩 构建脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh
set -e

# 定义变量
BUILD_DIR=$WORKSPACE
DEPLOY_DIR=/var/www/wms
CONTAINER_NAME=webman-admin-php82

echo "📦 同步代码到容器..."
docker cp "$BUILD_DIR/." "$CONTAINER_NAME:$DEPLOY_DIR"

echo "🚀 在容器内执行部署..."
docker exec -i $CONTAINER_NAME sh -c "
    cd $DEPLOY_DIR && \
    composer install --no-dev -o && \
    php start.php stop && \
    php start.php start -d
"

echo "✅ 部署完成!"

📝 脚本说明

变量定义

  • BUILD_DIR=$WORKSPACE:Jenkins 工作空间目录
  • DEPLOY_DIR=/var/www/wms:容器内的部署目录
  • CONTAINER_NAME=webman-admin-php82:目标容器名称

部署流程

  1. 同步代码:使用 docker cp 将构建目录的所有文件复制到容器内
  2. 安装依赖:在容器内执行 composer install --no-dev -o 安装生产环境依赖
  3. 重启服务:停止并重新启动 Webman 服务

关键参数说明

  • --no-dev:不安装开发依赖
  • -o:优化自动加载器
  • -d:以守护进程模式启动

🔧 注意事项

  1. 容器状态:确保目标容器 webman-admin-php82 正在运行
  2. 权限问题:Jenkins 需要有执行 Docker 命令的权限
  3. 目录权限:确保容器内的部署目录有正确的读写权限
  4. 服务依赖:如果项目依赖数据库等服务,确保这些服务已启动

🚨 故障排除

常见问题

  1. 容器不存在

    1
    
    Error: No such container: webman-admin-php82
    

    解决:检查容器名称是否正确,容器是否正在运行

  2. 权限被拒绝

    1
    
    permission denied while trying to connect to the Docker daemon socket
    

    解决:将 Jenkins 用户添加到 docker 组

  3. Composer 安装失败

    1
    
    composer install failed
    

    解决:检查网络连接,或配置 Composer 镜像源

调试技巧

  • 在脚本中添加更多 echo 语句来跟踪执行进度
  • 使用 docker logs $CONTAINER_NAME 查看容器日志
  • 临时移除 set -e 来继续执行后续命令进行调试

📚 相关资源

使用 Hugo 构建
主题 StackJimmy 设计