• php deployer 从入门到精通


    安装git

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

    安装lnmp 环境 (centos 7)

    安装 nginx

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

    安装 mysql5.7

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

    安装php7.4

    1. yum install libxml2-devel bzip2 bzip2-devel curl-devel libjpeg-devel libpng libpng-devel freetype-devel libxslt-devel libzip-devel -y
    2. yum install libtool sqlite-devel epel-release -y
    3. rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    4. yum install -y oniguruma oniguruma-devel
    5. yum clean all && yum makecache
    6. 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
    7. ./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
    8. make && make install
    9. cp php.ini-production /usr/local/php/etc/php.ini
    10. cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
    11. cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    12. chmod 755 /etc/init.d/php-fpm
    13. ln -s /usr/local/php/bin/php /usr/local/bin/php
    14. # 查看php.ini位置
    15. php -i | grep php.ini

    安装composer

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

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

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

     开始使用deployer

     dep init

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

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

    1. namespace Deployer;
    2. require 'recipe/common.php';
    3. use Deployer\Exception\GracefulShutdownException;
    4. add('recipes', ['thinkphp']);
    5. set('writable_dirs', [
    6. 'runtime',
    7. ]);
    8. set('thinkphp_version', function () {
    9. $result = run('{{bin/php}} {{release_or_current_path}}/think --version');
    10. preg_match_all('/(\d+\.?)+/', $result, $matches);
    11. return $matches[0][0] ?? 6.0;
    12. });
    13. /**
    14. * Run an artisan command.
    15. *
    16. * Supported options:
    17. * - 'min' => #.#: The minimum think version required (included).
    18. * - 'max' => #.#: The maximum think version required (included).
    19. * - 'skipIfNoEnv': Skip and warn the user if `.env` file is inexistant or empty.
    20. * - 'failIfNoEnv': Fail the command if `.env` file is inexistant or empty.
    21. * - 'showOutput': Show the output of the command if given.
    22. *
    23. * @param string $command The artisan command (with cli options if any).
    24. * @param array $options The options that define the behaviour of the command.
    25. * @return callable A function that can be used as a task.
    26. */
    27. function think($command, $options = [])
    28. {
    29. return function () use ($command, $options) {
    30. // Ensure the think command is available on the current version.
    31. $versionTooEarly = array_key_exists('min', $options)
    32. && thinkphp_version_compare($options['min'], '<');
    33. $versionTooLate = array_key_exists('max', $options)
    34. && thinkphp_version_compare($options['max'], '>');
    35. if ($versionTooEarly || $versionTooLate) {
    36. return;
    37. }
    38. // Ensure we warn or fail when a command relies on the ".env" file.
    39. if (in_array('failIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) {
    40. throw new \Exception('Your .env file is empty! Cannot proceed.');
    41. }
    42. if (in_array('skipIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) {
    43. warning("Your .env file is empty! Skipping...");
    44. return;
    45. }
    46. $think = '{{release_or_current_path}}/think';
    47. // Run the artisan command.
    48. $output = run("{{bin/php}} $think $command");
    49. // Output the results when appropriate.
    50. if (in_array('showOutput', $options)) {
    51. writeln("$output");
    52. }
    53. };
    54. }
    55. function think_version_compare($version, $comparator)
    56. {
    57. return version_compare(get('thinkphp_version'), $version, $comparator);
    58. }
    59. /*
    60. * Maintenance mode.
    61. */
    62. set('keep_releases', 5);
    63. host('hostA')
    64. ->setRemoteUser('root')
    65. ->setPort(22)
    66. ->setDeployPath("/home/service/{{application}}")
    67. ->set('branch', 'master') // 最新的主分支部署到生产机
    68. ->setConfigFile("/root/.ssh/config")
    69. ->setForwardAgent(true)
    70. ->setSshMultiplexing(true)
    71. ->set('http_user', 'www') // 这个与 nginx 里的配置一致
    72. ->setSshArguments(['-o StrictHostKeyChecking=no', '-o UserKnownHostsFile=/dev/null']);
    73. desc("清除runtime,模板缓存,路由缓存");
    74. task("thinkphp:clear",think("clear",['showOutput']));
    75. desc("生成路由缓存");
    76. task("optimize:route",think("optimize:route",['showOutput']));
    77. desc("重启php");
    78. task('php-fpm:restart', function () {
    79. run('systemctl restart php-fpm');
    80. });
    81. desc("部署成功,自定义通知");
    82. task("send_message",function(){
    83. echo "部署成功!";
    84. });
    85. desc("生成数据表缓存");
    86. task("optimize:schema",think("optimize:schem",['showOutput']));
    87. /**
    88. * Main deploy task.
    89. */
    90. after('deploy:symlink', 'php-fpm:restart');
    91. after('deploy:success', 'send_message');
    92. after('deploy:failed', 'deploy:unlock');;
    93. // Config
    94. set('application', 'thinkphp');
    95. set('repository', 'git@gitee.com:afgadfas/think.git');
    96. set('git_tty', true);
    97. // Hosts
    98. task("deploy:over", function () {
    99. run("chmod -R 755 {{deploy_path}} && chown www.www -R {{deploy_path}}");
    100. });
    101. desc('部署项目');
    102. // Hooks
    103. task('deploy', [
    104. 'deploy:prepare', // 登录服务器
    105. 'deploy:release', // 创建发布目录
    106. 'deploy:update_code', // 下载源代码
    107. 'deploy:vendors', // 更新composer
    108. 'deploy:publish',
    109. 'thinkphp:clear',
    110. 'optimize:route',
    111. 'optimize:schema',
    112. 'deploy:over',
    113. ]);
    114. after('deploy:failed', 'deploy:unlock');

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

    1. set(string $name, $value): void 设置配置选项
    2. task(string $name, $body = null): Task 定义新任务并保存到任务列表
    3. add(string $name, array $array): void  将新的配置参数合并到现有的配置数组。
    4. 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中

    常见的部署命令

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

  • 相关阅读:
    Redis的常用数据结构之字符串类型
    终于可以一行代码也不用改了!ShardingSphere 原生驱动问世
    大数据技术——Flume简介&安装配置&使用案例
    常见DDoS攻击
    毫末AI DAY的智驾弹药:上有「世界模型」,下有3000元方案
    word交叉引用的使用
    卡片布局以及鼠标悬浮展示全部
    安全加固 MariaDB 和 MySQL 数据库
    修改this的指向
    OSCP-Vulnhub靶机记录-LordoftheRoot-walkthrough
  • 原文地址:https://blog.csdn.net/azh89125/article/details/126511877