自动化部署 - Laravel Deploy实战

简介: 自动化部署 - Laravel Deploy实战

Deployer 是一个基于 SSH 协议的无侵入 web 项目部署工具,因为它不需要你在目标服务器上装什么服务之类的东西即可使用,它的原理就是通过 SSH 到你的机器去创建目录,移动文件,执行指定的动作来完成项目的部署。他支持多种框架:LaravelYii

流程:

  • 在本地使用 composer 安装 deployer
  • Linux 服务器添加账户与配置权限
  • 项目 git 仓库允许服务器访问(clone 代码)
  • 部署我们的 web 项目

安装deploy

官网:https://deployer.org/docs/installation.html

我这里是局部安装,大家可以选择命令式全局安装或者composer全局安装,根据大家需要求选择。

我这里直接安装了一个新的laravel项目,然后准备对他进行deploy初始化。

php vendor/bin/dep init
# 这里会叫你去设置框架类型和远程仓库
# 最后成功啦就会在项目根目录看见一个deploy.php

配置deploy

  • 配置文件
<?php
namespace Deployer;
require 'recipe/laravel.php';
set('laravel-server', '192.168.1.1);
// Project name
set('application', 'laravel-dep');
// Project repository
set('repository', 'git@code.aliyun.com:testsmile/laravel-dep.git');
// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true); 
// 分享文件即目录,通常也不用改,默认包含了 storage 目录
add('shared_files', []);
add('shared_dirs', []);
// 可写目录,一般不用改
add('writable_dirs', []);
set('allow_anonymous_stats', false);
// 保存最近五次部署,这样的话回滚最多也只能回滚到前 5 个版本
set('keep_releases', 5);
set('writable_use_sudo', false);
// 配置服务器主机
host(get('laravel-server'))
    ->stage('production')
    ->set('branch', 'master') // 最新的主分支部署到生产机
    ->user('root')
    ->port(22)
    ->set('http_user', 'www-data') // 这个与 nginx 里的配置一致
    ->set('deploy_path', '/var/www/{{application}}')
    ->identityFile('~/.ssh/deployerkey') # 这里直接指定sshkey就不需要密码啦
    ->forwardAgent(true);
// 这算是个自定义任务示例
task('build', function () {
    run('cd {{release_path}} && build');
});
// 如果部署失败,自动解除部署锁定状态,以免影响下次执行
after('deploy:failed', 'deploy:unlock');
// 执行数据库迁移 我这里就不迁移了 大家根据情况来
//before('deploy:symlink', 'artisan:migrate');

部署

php vendor/bin/dep deploy production -vvv
# 期间会看到很多的部署日志输出 如果有什么错误对应解决就行,我这边有些扩展没有 我安装了一下就好啦
  • Unable to prepare route [api/user] for serialization. Uses Closure.

这个问题是闭包路由无法缓存,将apiuser路由和首页那个闭包路由改成使用控制器或者注释掉,要记得提交代码

首次部署设置一下envnginx配置也是需要创建的。对于 .env 文件,存放于目标主机的 /path/to/project/shared/ 目录下。

修改 .env 后记得重新缓存配置 php artisan config:cache

另外需要注意的是配置 nginx 站点时,网站根目录应该为 /path/to/project/current/public。如果使用 supervisor 之类的,相关的目录在配置时也要注意了。

部署后目录的结构及相关说明

| projectname
    |--- @current -> releases/<num>
    |--- .dep
        |--- releases 一个文本文件,里面存着各次部署的时间、次数序号(或者说版本号)信息
    |--- releases // 目录下根据配置保存近几次部署,更早的则会被自动清理
        |--- 1
        |--- 2
        |--- .
        |--- .
        |--- <num>
            |--- 目录中是项目的实际代码
            |--- 包括 .git, vendor, .env, storage ...
            |---  .env, storage 实际通过 symlink 链接到 shared 目录下对应的文件上
    |--- shared
        |--- storage // 即 laravel 项目的 storage 文件夹
        |--- .env // 即 laravel 项目的 .env

每次部署更新,会在 releases 下新建文件夹如 num,拉取对应的最新代码,安装 composer 依赖完成一些其它自定义任务,并将 storage, .env 链接到 shared 文件夹下的那两个上去,然后项目根目录下的 current 通过 syslink 链接到这个新文件夹 num 上,这算是其动作的基本原理,网站在部署过程中能继续访问也得益于此。

.envstorage 下的一些未加入代码库中的内部,部署时不会自动更新,因此有些情况下需要手动处理。

nginx配置

server {
    listen 80;
    server_name test.aoppp.com;
    root /var/www/laravel-dep/current/public;
    index index.php index.html index.htm;
    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }
    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        include fastcgi_params;
    }
    location ~ /\.ht {
        deny all;
    }
}

这里要注意,你php-fpmlistensock就采用sock,根据自己来。

最终部署成功

  • 参考

这个也是简单部署

部署权限看这个

目录
相关文章
|
19天前
|
存储 SQL 运维
使用PowerShell进行自动化脚本编写:入门与实战
【6月更文挑战第6天】本文介绍了PowerShell作为Windows系统管理的自动化工具,用于提升效率和减少错误。内容涵盖PowerShell基础,如变量、命令执行、管道、条件和循环语句、函数。实战案例展示了如何用PowerShell脚本进行文件备份。此外,还提及PowerShell的进阶功能,如模块、远程管理和与其他工具集成。学习和应用PowerShell能有效提升IT运维自动化水平。
|
17天前
|
数据采集 Web App开发 JavaScript
Puppeteer实战案例:自动化抓取社交媒体上的媒体资源
Puppeteer实战案例:自动化抓取社交媒体上的媒体资源
|
1月前
|
监控 数据可视化 IDE
python自动化测试实战 —— 单元测试框架
python自动化测试实战 —— 单元测试框架
36 2
|
1月前
|
Web App开发 JavaScript 测试技术
python自动化测试实战 —— WebDriver API的使用
python自动化测试实战 —— WebDriver API的使用
31 1
|
1月前
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
1月前
|
jenkins Java 持续交付
Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
|
1月前
|
Python
Python自动化办公实战案例:文件整理与邮件发送
Python自动化办公实战案例:文件整理与邮件发送
22 0
|
1月前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
210 0
|
1月前
|
Web App开发 设计模式 测试技术
python自动化测试实战 —— 自动化测试框架的实例
python自动化测试实战 —— 自动化测试框架的实例
30 0
|
1月前
|
jenkins Java 持续交付
实战指南:运用Jenkins实现Java项目的持续集成与自动化部署
【4月更文挑战第17天】Jenkins是一款强大的开源CI/CD工具,广泛用于Java项目的自动化构建、测试和部署。通过配置Jenkins环境、创建Job、设定构建触发器和步骤,实现持续集成和部署。集成Maven、Git等工具,确保代码质量并加速上线。持续部署阶段,Jenkins可将工件发布至远程服务器或云环境,实现高效、稳定的自动化流程。实践过程中,关注工作流优化、配置备份和服务器状态监控,以提升整体开发效率和软件质量。