基于 Docker 实现 GitLab + Jenkins 编译 Laravel 项目并部署多台服务器
文章顺序
- 使用 Docker 搭建 Jenkins 与 GitLab 环境,实现私有 GitLab 项目触发 Webhooks 构建 (环境搭建)
- Window10 通过 SSH 访问 Docker 容器(SSH 连接问题解决)
- 基于 Docker 实现 GitLab + Jenkins 编译 Laravel 项目并部署多台服务器(部署实战)
参考
- https://www.jianshu.com/p/25b2fef08674
- https://www.cnblogs.com/jying/p/15467956.html
- https://juejin.cn/post/7160951830401253413
- https://blog.csdn.net/u013066244/article/details/52788407
- https://blog.csdn.net/JineD/article/details/108193773
- https://blog.csdn.net/czhphp/article/details/54374982
- https://segmentfault.com/q/1010000042651324
注意
- jenkins 还可以回滚操作,更多玩法请自行搜索。
- 本文构建项目是在
构建后操作
步骤构建项目,建议正常项目在Build Steps
步骤构建项目。 - SSH Publishers->Source files 设置为
**
才可以复制隐藏文件。 ls -la
命令可以在linux可以查看.
前缀文件,也就是查看隐藏文件。- 发布机连接服务机也可以通过账号与密码的方式进行连接,不仅仅生成 ssh-keygen 的方式。
环境
软件/系统 | 版本 | 说明 |
---|---|---|
Windows | Windows 10 专业版 22H2 19045.4046 | |
Docker Desktop | 4.27.1 | |
Docker | 25.0.2 | |
Docker Compose | v2.24.3-desktop.1 | |
Jenkins | 2.426.2-jdk17 | |
GitLab | 16.9.0-ce.0 | |
PHP | php:8.0-cli | Docker 容器 |
Laravel | v8.83.26 | |
Composer | 2.7.1 |
基础容器与服务容器连接同一 Docker 网络。
基础容器:jenkins容器1台(发布机)、gitlab容器1台。
服务容器:php容器2台(服务机)。
正文
文件列表
./docker-compose-base.yml
./docker-compose-server.yml
./php/
Dockerfile
sources.list
-
docker-compose-base.yml
version: '3' services: jenkins: image: jenkins/jenkins:2.426.2-jdk17 networks: - base-network container_name: jenkins ports: - 8080:8080 - 50000:50000 gitlab: image: gitlab/gitlab-ce:16.9.0-ce.0 networks: - base-network container_name: gitlab ports: - 10443:443 - 1080:80 # 与网络服务容器连接同一网络才可以ping通 networks: base-network:
-
docker-compose-server.yml
version: '3' services: php1: build: ./php networks: - base-network container_name: php1 ports: - "8081:8000" # 本地主机访问容器ssh为:ssh root@127.0.0.1 -p 2021 - "2021:22" # 相当于 -d,防止执行完毕后关闭容器 https://blog.csdn.net/fighterandknight/article/details/124478429 stdin_open: true # 相当于 -t # tty: true php2: build: ./php networks: - base-network container_name: php2 ports: - "8082:8000" # 本地主机访问容器ssh为:ssh root@127.0.0.1 -p 2021 - "2022:22" # 相当于 -d,防止执行完毕后关闭容器 https://blog.csdn.net/fighterandknight/article/details/124478429 stdin_open: true # 相当于 -t # tty: true # 与基础服务容器连接同一网络才可以ping通 networks: base-network:
-
php/Dockerfile
FROM php:8.0-cli COPY sources.list /etc/apt/ WORKDIR /code/public # 设置root密码 https://blog.csdn.net/qq_27865227/article/details/121649574 RUN apt-get update && \ apt-get install -y openssh-server && \ apt-get install -y net-tools && \ apt-get install git -y && \ apt-get install zip -y && \ apt-get install nano -y && \ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \ echo "root:123456" | chpasswd && \ curl -sS https://getcomposer.org/installer -o composer-setup.php && \ php composer-setup.php --install-dir=/usr/local/bin --filename=composer CMD service ssh start && php -S 0.0.0.0:8000
-
php/sources.list
# https://wph.im/190.html deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free
php 容器配置(服务机)
生成 ssh-keygen 是为了 jenkins 发布机能够免密登录 php 服务机。
-
通过 Docker Desktop 进入 jenkins 容器,执行
ssh-keygen -t rsa
创建密匙(所有选项默认,按回车即可),生成后可以获取 identification(私钥)与 public key (公钥)。$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): Created directory '/var/jenkins_home/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /var/jenkins_home/.ssh/id_rsa Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub The key fingerprint is: SHA256:3HKLxO+tiCBuAY/Se9JII9AlAvZ9zwyFrbFsalTHnec jenkins@fa68bdd8a6a9 The key's randomart image is: +---[RSA 3072]----+ |o. +.. . | |o o o +.+ o . | | o + .oo= o | |o . ..B=. E | |.= . o S+o | |+ * o . = . | |.o.*o . o | | .=.o. . o . | | ..o . . o.. | +----[SHA256]-----+
-
通过 Docker Desktop 进入 php 服务容器,将在 jenkis 中获得的 public key (公钥)完整粘贴到
~/.ssh/authorized_keys
中,如果有多个 php 服务容器,就重复操作。
jenkins 配置
-
本文中 jenkins 容器绑定本地的 web 端口为 8080,访问
http://127.0.0.1:8080
进入控制台,Dashboard
->系统管理
->插件管理
。
-
Plugins
->Available plugins
搜索Publish over SSH
,选中后进行安装。
-
点击安装后自动跳转安装页面,等待安装完毕后再执行下一步操作。
-
打开
Dashboard
->系统管理
->系统配置
。
-
找到
Publish over SSH
,设置完毕后点击保存。- 设置 Path to key:值为通过
ssh-keygen -t rsa
生成的 identification(私钥)路径。 - 新增 SSH Servers (有两台服务容器,所以添加了两个 SSH Server)
- php1(配置完毕后可以在右下角位置点击
Test Configuration
测试该连接)- Name:
php1
(在选择服务器的时候,会显示该字段) - Hostname:
php1
(由于在同一 Docker 网络,指定容器名即可,如果是远程服务器,指定对应 ip 即可。) - Username:
root
(登录到远程服务器的账号) - Remote Directory:
/code
(部署时,所有文件存放是基于该文件夹,如:任务->构建后操作的 Remote directory 指定的是 /code,那么最终部署到远程服务器的文件所在目录就是 /code/code/)
- Name:
- php2(配置完毕后可以在右下角位置点击
Test Configuration
测试该连接)- Name:
php2
(在选择服务器的时候,会显示该字段) - Hostname:
php2
(由于在同一 Docker 网络,指定容器名即可,如果是远程服务器,指定对应 ip 即可。) - Username:
root
(登录到远程服务器的账号) - Remote Directory:
/code
(部署时,所有文件存放是基于该文件夹,如:任务->构建后操作的 Remote directory 指定的是 /code,那么最终部署到远程服务器的文件所在目录就是 /code/code/)
- Name:
- php1(配置完毕后可以在右下角位置点击
- 设置 Path to key:值为通过
-
找到本文示例任务
testlaravel
->配置
。
-
Configure
->构建后操作
->Send build artifacts over SSH
-
配置 SSH Server
- Name:选择在 SSH Servers 中添加的服务器,有多台服务器则配置多次。
- Transfers
- Source files:
**
(**
可以复制隐藏文件) - Remote directory:
- Exec command:(部署完毕后执行的命令)
cd /code mkdir bootstrap/cache mkdir storage/framework mkdir storage/framework/cache mkdir storage/framework/views mkdir storage/framework/sessions composer install cp .env.example .env php artisan key:generate
- Source files:
测试
-
在项目页面点击
立即构建
,刷新页面或者等待一会后,左下角会显示新的构建历史。
-
php1 容器绑定的主机端口为 8081,php2 容器绑定的主机端口为 8082。 访问
http://localhost:8081/
、http://localhost:8082/
成功部署。
地 址 :https://www.cnblogs.com/xiaqiuchu/p/18020586
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义