基于 Docker 实现 GitLab + Jenkins 编译 Laravel 项目并部署多台服务器

文章顺序

  1. 使用 Docker 搭建 Jenkins 与 GitLab 环境,实现私有 GitLab 项目触发 Webhooks 构建 (环境搭建)
  2. Window10 通过 SSH 访问 Docker 容器(SSH 连接问题解决)
  3. 基于 Docker 实现 GitLab + Jenkins 编译 Laravel 项目并部署多台服务器(部署实战)

参考

注意

  1. jenkins 还可以回滚操作,更多玩法请自行搜索。
  2. 本文构建项目是在 构建后操作 步骤构建项目,建议正常项目在 Build Steps 步骤构建项目。
  3. SSH Publishers->Source files 设置为 ** 才可以复制隐藏文件。
  4. ls -la 命令可以在linux可以查看.前缀文件,也就是查看隐藏文件。
  5. 发布机连接服务机也可以通过账号与密码的方式进行连接,不仅仅生成 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
  1. 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:
    
    
  2. 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:
    
    
    
  3. 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
    
  4. 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 服务机。

  1. 通过 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]-----+
    
  2. 通过 Docker Desktop 进入 php 服务容器,将在 jenkis 中获得的 public key (公钥)完整粘贴到 ~/.ssh/authorized_keys 中,如果有多个 php 服务容器,就重复操作。

jenkins 配置

  1. 本文中 jenkins 容器绑定本地的 web 端口为 8080,访问 http://127.0.0.1:8080 进入控制台,Dashboard->系统管理->插件管理
    image

  2. Plugins->Available plugins 搜索 Publish over SSH,选中后进行安装。
    image

  3. 点击安装后自动跳转安装页面,等待安装完毕后再执行下一步操作。
    image

  4. 打开 Dashboard->系统管理->系统配置
    image

  5. 找到 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/)
      • php2(配置完毕后可以在右下角位置点击 Test Configuration 测试该连接)
        • Name:php2(在选择服务器的时候,会显示该字段)
        • Hostname:php2(由于在同一 Docker 网络,指定容器名即可,如果是远程服务器,指定对应 ip 即可。)
        • Username:root(登录到远程服务器的账号)
        • Remote Directory:/code(部署时,所有文件存放是基于该文件夹,如:任务->构建后操作的 Remote directory 指定的是 /code,那么最终部署到远程服务器的文件所在目录就是 /code/code/)

    image
    image
    image

  6. 找到本文示例任务 testlaravel->配置
    image

  7. Configure-> 构建后操作->Send build artifacts over SSH
    image

  8. 配置 SSH Server

    • Name:选择在 SSH Servers 中添加的服务器,有多台服务器则配置多次
    • Transfers
      • Source files:** (**可以复制隐藏文件)
      • Remote directory: (留空即可,与 SSH Servers 中设置 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  
        

    image

测试

  1. 在项目页面点击 立即构建,刷新页面或者等待一会后,左下角会显示新的构建历史。
    image

  2. php1 容器绑定的主机端口为 8081,php2 容器绑定的主机端口为 8082。 访问http://localhost:8081/http://localhost:8082/成功部署。
    image

posted @   夏秋初  阅读(208)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示