安装git

yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm

安装lnmp 环境 (centos 7)

安装 nginx

yum -y install gcc gcc-c++ autoconf automake make yum install pcre-devel -y yum install zlib -y
yum install openssl openssl-devel
wget  http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz && cd nginx-1.20.2 && ./configure --prefix=/usr/local/nginx && make && make install

安装 mysql5.7

wget http://repo.mysql.com/mysql57-community-release-el7-9.noarch.rpm
sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm
yum -y install mysql-community-server --nogpgcheck
systemctl start mysqld
grep 'temporary password' /var/log/mysqld.log
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abcd123456';
systemctl enable mysqld

安装php7.4

yum install libxml2-devel bzip2 bzip2-devel curl-devel libjpeg-devel libpng libpng-devel freetype-devel libxslt-devel libzip-devel -y
yum install libtool sqlite-devel epel-release -y
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install -y oniguruma oniguruma-devel
yum clean all && yum makecache
wget https://www.php.net/distributions/php-7.4.26.tar.gz && tar -zxvf php-7.4.26.tar.gz && cd php-7.4.26
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm-user=mysql --with-fpm-group=mysql --with-curl  --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64  --with-mysqli=mysqlnd --with-openssl  --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd --with-pdo-sqlite --with-pear  --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath  --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-fpm
make && make install
cp php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.d/www.conf.default  /usr/local/php/etc/php-fpm.d/www.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpmln -s /usr/local/php/bin/php /usr/local/bin/php# 查看php.ini位置
php -i | grep php.ini

安装composer

curl -sS https://getcomposer.org/installer | php
mv composer.phar  /usr/local/bin/composer
composer config -g repo.packagist composer https://packagist.phpcomposer.com

安装deployer (我们安装的是最新的版本7.x,部分函数与6.x不一样)

mkdir /root/dep && cd dep
#第一种:通过 Phar 存档,只需运行一下命令即可
curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
#第二种:通过 composer 安装
chmod +x /usr/local/bin/dep
composer require --dev deployer/deployer
#将别名添加到.bashrc文件中
alias dep='/root/dep/vendor/bin/dep'
source .bash_profile
#第三种:通过 Github 源代码安装:clone 最新的代码
1. git clone https://github.com/deployphp/deployer.git
2. 在源代码目录下运行:
php ./build

开始使用deployer

dep init

我们选择0,1是以配置的形式,我没有使用过(配置完成后用Import 导入即可)自己可以实验一下

这里有各种框架使用的模板,只需要在deployer.php 引用即可。不过使用的时候要注意跟自己的业务逻辑有没有冲突,尤其是清除缓存,有些redis 缓存不能删除,所以我本人一般不使用模板(直接选择2 common),另外很多框架和php系统也没有,私人定制似乎更好一些,在这里需要注意一点,必须设置php全局变量,因为deployer 默认命令是在/usr/lcoal/bin/php中 (现在以thinkphp 为例子)

<?phpnamespace Deployer;
require 'recipe/common.php';
use Deployer\Exception\GracefulShutdownException;
add('recipes', ['thinkphp']);
set('writable_dirs', ['runtime',
]);
set('thinkphp_version', function () {$result = run('{{bin/php}} {{release_or_current_path}}/think --version');preg_match_all('/(\d+\.?)+/', $result, $matches);return $matches[0][0] ?? 6.0;
});/*** Run an artisan command.** Supported options:* - 'min' => #.#: The minimum think version required (included).* - 'max' => #.#: The maximum think version required (included).* - 'skipIfNoEnv': Skip and warn the user if `.env` file is inexistant or empty.* - 'failIfNoEnv': Fail the command if `.env` file is inexistant or empty.* - 'showOutput': Show the output of the command if given.** @param string $command The artisan command (with cli options if any).* @param array $options The options that define the behaviour of the command.* @return callable A function that can be used as a task.*/
function think($command, $options = [])
{return function () use ($command, $options) {// Ensure the think command is available on the current version.$versionTooEarly = array_key_exists('min', $options)&& thinkphp_version_compare($options['min'], '<');$versionTooLate = array_key_exists('max', $options)&& thinkphp_version_compare($options['max'], '>');if ($versionTooEarly || $versionTooLate) {return;}// Ensure we warn or fail when a command relies on the ".env" file.if (in_array('failIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) {throw new \Exception('Your .env file is empty! Cannot proceed.');}if (in_array('skipIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) {warning("Your .env file is empty! Skipping...</>");return;}$think = '{{release_or_current_path}}/think';// Run the artisan command.$output = run("{{bin/php}} $think $command");// Output the results when appropriate.if (in_array('showOutput', $options)) {writeln("<info>$output</info>");}};
}function think_version_compare($version, $comparator)
{return version_compare(get('thinkphp_version'), $version, $comparator);
}/** Maintenance mode.*/
set('keep_releases', 5);
host('hostA')->setRemoteUser('root')->setPort(22)->setDeployPath("/home/service/{{application}}")->set('branch', 'master') // 最新的主分支部署到生产机->setConfigFile("/root/.ssh/config")->setForwardAgent(true)->setSshMultiplexing(true)->set('http_user', 'www') // 这个与 nginx 里的配置一致->setSshArguments(['-o StrictHostKeyChecking=no', '-o UserKnownHostsFile=/dev/null']);
desc("清除runtime,模板缓存,路由缓存");
task("thinkphp:clear",think("clear",['showOutput']));
desc("生成路由缓存");
task("optimize:route",think("optimize:route",['showOutput']));
desc("重启php");
task('php-fpm:restart', function () {run('systemctl restart php-fpm');
});
desc("部署成功,自定义通知");
task("send_message",function(){echo "部署成功!";
});
desc("生成数据表缓存");
task("optimize:schema",think("optimize:schem",['showOutput']));
/*** Main deploy task.*/
after('deploy:symlink', 'php-fpm:restart');
after('deploy:success', 'send_message');
after('deploy:failed', 'deploy:unlock');;
// Config
set('application', 'thinkphp');
set('repository', 'git@gitee.com:afgadfas/think.git');
set('git_tty', true);// Hosts
task("deploy:over", function () {run("chmod -R 755 {{deploy_path}} && chown www.www -R {{deploy_path}}");
});
desc('部署项目');
// Hooks
task('deploy', ['deploy:prepare', // 登录服务器'deploy:release', // 创建发布目录'deploy:update_code', // 下载源代码'deploy:vendors', // 更新composer'deploy:publish','thinkphp:clear','optimize:route','optimize:schema','deploy:over',
]);
after('deploy:failed', 'deploy:unlock');

接下来我们将详细讲解一下各个命令的作用

set(string $name, $value): void 设置配置选项task(string $name, $body = null): Task 定义新任务并保存到任务列表add(string $name, array $array): void  将新的配置参数合并到现有的配置数组。run(string $command, ?array $options = [], ?int $timeout = null, ?int $idle_timeout = null, ?string $secret = null, ?array $env = null, ?bool $real_time_output = false, ?bool $no_throw = false): string  在远程主机上执行给定的命令

这几个命令比较常用,自己随便练习一下就能很快知道使用规则 更多命令

脚本最主要的是配置公钥和私钥,主要是ssh远程登陆,和github(我们这里以gitee作为说明)

1.ssh登陆的公钥和私钥,在本地生成(也就是php客户端,不是服务器)我本地用的是虚拟机(linux)环境,因为我在windows 环境下使用deployer无法连接ssh,如果你能连接请告诉我。

ssh-keygen -t rsa -C “youremail@your.com” -f ~/.ssh/github-rsa  然后一路回车,如果你不输入名称,gitee生成公钥和私钥就会覆盖ssh的公钥私钥。因为默认名称都是id_rsa。生成文件的位置是在当前用户.ssh目录下(/root/.ssh)

把公钥id_rsa.pub 复制到服务器/root/.ssh下的authorized_keys 多个公钥只需要在后面追加即可

编辑config 文件 配置ssh信息,我的是

hostA 即是ssh 配置信息,host gitee.com 是gitee的配置

同理配置gitee ,然后把laravel-admin.pub 复制到gitee.com ssh keys中

常见的部署命令

#清理旧的发布版本 (只保留最近两个)
dep deploy:cleanup
#覆盖回滚候选 如果没有-o 选项直接回滚到上一个版本 (回滚后会生成一个新版本)
dep rollback -o rollback_candidate=123
#删除文件锁
dep deploy:unlock
#发布 host是要发布的环境,也即是config文件对应的
dep deploy hostA #如果要查看发布日志dep deploy hostA -vvv

遇见的问题,deploy:cleanup不起作用

我在开启了deploy:cleanup 后发现每次都把所有的旧版本都清理了,经过多次测试,并且查看了相关源码,release_log

这个release_log 记录了所有部署过程中 的日志,只要是成功的,就有两个一样的日记录,是部署开始和部署结束,部署失败只有一条记录。而cleanup这个命令的代码

releases_list 获取的是所有成功的日志,这样每个版本就会有两个一样的版本,假如总共有3个版本,release_list 获取的是6条记录的日志,这样array_slice 切割就会出现错误。正确的做法是用array_unique 过滤一下重复的,正确的做法是这样的

所以cleanup 需要重写,或者重新定义。

现在自定义一个thinkphp的发布

php deployer 从入门到精通相关推荐

  1. Github教程】史上最全github使用方法:github入门到精通

    [Github教程]史上最全github使用方法:github入门到精通 [初识Github] 首先让我们大家一起喊一句"Hello Github".YEAH!就是这样. Git是 ...

  2. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

  3. 虚幻引擎5(UE5)实时VFX游戏特效制作入门到精通

    UE5 Niagara学习教程  课程获取:虚幻引擎5(UE5)实时VFX游戏特效制作入门到精通-云桥网 你会学到什么 我将通过创建各种各样的实时效果来教你虚幻引擎中强大的粒子系统. 我们将从简单的基 ...

  4. Revit:从入门到精通学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确) |大小:8.07 GB |时长:12h 16m Re ...

  5. 《Java 开发从入门到精通》—— 2.2 编写第一段Java程序

    本节书摘来异步社区<Java 开发从入门到精通>一书中的第2章,第2.2节,作者: 扶松柏 , 陈小玉,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.2 编 ...

  6. meteor从入门到精通_我已经大规模运行Meteor一年了。 这就是我所学到的。

    meteor从入门到精通 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 我已经大规模运行Meteor一年了. 这就是我所学到的. (I've been runni ...

  7. Java学习从入门到精通的学习建议

    想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...

  8. ASP网络编程从入门到精通 下载

    <ASP网络编程从入门到精通> 清华大学出版社 特点: 面向ASP零基础读者,循序渐进 全面分析ASP技术细节 用代码描述个个知识点,操作性强 通过典型模块设计,体会ASP的奥妙 通过网上 ...

  9. 【组队学习】【28期】数据采集从入门到精通

    数据采集从入门到精通 论坛版块: http://datawhale.club/c/team-learning/38-category/38 开源内容: https://github.com/dataw ...

最新文章

  1. 安全隐患:神经网络可以隐藏恶意软件
  2. php 删除xls文件,使用PHPExcel将xls文件转换为xlsx时出错
  3. Linux有问必答:如何扩展XFS文件系统
  4. 独占一行 html_HTML基础-语义化标签
  5. html5 canvas图片渐变
  6. C++和C#相互调用COM组件的方法简介
  7. 被同事嘲笑说技术方案没深度?
  8. 手机屏幕宽高像素计算_2020年的智能手机拍照新设计,就全看下半年了
  9. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
  10. 升级步骤linux_开发人员福音,在win10系统上安装linux子系统
  11. Shell编程:简洁的 Bash Programming 技巧续篇
  12. 2线性模型 r语言_多层线性模型在R语言上的实现(三)
  13. mysql 比较一个字符串_比较MySQL中的两个字符串?
  14. vs需要迁移_【迁移指南】从Web开发者到Flutter开发者
  15. Win10使用FFmpeg操作Camera(十)
  16. php中文件上传$_FILES 的错误代码
  17. java程序员怎么创建自己的网站:第四章:做个网站引入广告赚点小钱
  18. Android 蓝牙4.0 BLE 获取链接设备Rssi值
  19. 深入理解数据库磁盘存储(Disk Storage)
  20. 大数据工程师的日常工作是什么?要掌握哪些核心技术?

热门文章

  1. 最近,微信终于支持多设备同时在线:最大问题是消息不同步
  2. 计算机系统维护工作内容
  3. 来了 来了 他真的来了
  4. 计算机二级基础知识【重】
  5. 2017河南省第四届互联网大会圆满落幕 云计算大数据创新成热点
  6. iTween基础之iTweenPath(自定义路径移动)
  7. [深入研究4G/5G/6G专题-22]: 5G NR开机流程3.4 - MAC层对SIB1的调度 - SIB1消息的格式与内容
  8. matplotlib—画正弦、余弦函数图
  9. moses 编译_Moses 训练步骤
  10. 计算机网络ip地址在哪,w7的ip地址在哪?小编教你怎么查看