使用git的hooks完成php项目的跨服务器自动发布

环境

LINUX下的gitlab服务器

LINUX下的测试服务器

目的

实现功能:当新的代码被推送至项目git库的指定分支中,测试服务器上的代码,同步更新。

思路

使用gitlab的hooks功能,采用post-receive脚本实现。当新代码被推送时,触发post-receive脚本,登陆到测试服务器,pull新的代码,然后composer升级相关php插件。

步骤

1.完成测试服务器的免密登陆

进入测试服务器root用户(或者指定用户)的.ssh目录,将id_rsa.pub中的内容,复制到gitlab服务器的git用户的authorized_keys中。注意在此文件中,一个用户的key为单独的一行。

使用gitlab服务器的git用户手动完成一次ssh登陆到测试服务器的操作,将服务器秘钥保存至gitlab服务器本地。

2.完成git操作时的免密登陆

在已经克隆完成的项目目录中,编辑./config文件,在尾部加入

[credential]
  helper = store

然后进行一次git pull操作,让登陆凭证自动保存。

3.在测试服务器编写执行脚本

在本项目中,在/opt/shell下建立一个pulldev.sh,加入以下内容,并赋予执行权限

#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "${time}" # 以上两行输出执行脚本时的时间
cd /var/www/html/ # 进入项目目录
git pull # 以上两行执行代码的同步
docker exec -it laravel-php /bin/bash -c "cd /var/www/html/ && composer install" # 本行是在php容器内执行“composer install”命令
exit 0 # 退出
# chmod +x pulldev.sh

4.在gitlab服务器编写post-receive脚本

在gitlab服务器中,进入/var/opt/gitlab/git-data/repositories中,找到项目的库目录,如xxx.git。将原有的hooks目录移动走,mv hooks bak_hooks。然后新建hooks目录,并编辑post-receive脚本,键入如下内容:

#!/bin/sh
NowPath=`pwd`
unset GIT_DIR # 非常关键,释放该变量在上次执行后的值
ssh 测试服务器用户名@测试服务器地址 "sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log;exit"
unset Git_DIR
cd $NowPath
exit 0
# chmod +x post-receive
# chown git.git -R /var/opt/gitlab/git-data/repositories/xxx.git/hooks ##非常关键,因为gitlab服务器对库的操作,都是用系统内的git用户来完成的。这也就是步骤1中为什么将id_rsa.pub添加到git用户的authorized_keys中。

5.测试

5.1在测试服务器,测试脚本:

# sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log
# cat /opt/shell/pulldev.log

5.2在gitlab服务器,验证post-receive脚本

# su git
$ sh /var/opt/gitlab/git-data/repositories/xxx.git/hooks/post-receive

登陆测试服务器:

# cat /opt/shell/pulldev.log
# cd /var/www/html/
# git log

5.3推送新代码测试

当开发人员向gitlab服务器的dev分支推送新代码后,执行5.2的第二步,观察代码是否更新,如果同步更新,则自动部署完毕。而在这时,开发人员的git客户端也会有相关提示。

使用docker完成laravel(LNMP)运行环境搭建

基础环境

腾讯云CENTOS7.4镜像

准备docker镜像

mysql:5.7

nginx:latest

php:7.2-fpm

phpmyadmin/phpmyadmin:latest

mysql,nginx,php配置文件

# docker run --name base_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# docker run --name base_php -d php:7.2-fpm
# docker run --name base_nginx -d nginx:latest
# mkdir /etc/laravel.docker.d
# mkdir /etc/laravel.docker.d/mysql && mkdir /etc/laravel.docker.d/php && mkdir /etc/laravel.docker.d/nginx
# mkdir /var/www/html

将配置文件分别拷贝到对应目录中,注意:php:7.2-fpm的配置文件在容器的/usr/local/etc下,nginx:latest的root路径是/usr/share/nginx/www

生成PHP扩展镜像

# vi Dockerfile
内容:
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev && docker-php-source extract && docker-php-source delete && docker-php-ext-config gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-gd && docker-php-ext-install gd && docker-php-ext-install zip && docker-php-ext-install mysqli && docker-php-ext-install pdo_mysql && docker-php-ext-install opcache && cd ~ && php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && chmod +x composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer && composer config -g repo.packagist composer https://packagist.phpcomposer.com && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/*
# docker build -t php-ext:0.1 .

注意:经过试验,用composer容器运行composer会提示很多扩展包不存在的错误,因为不熟悉php镜像的结构和php配置文件,不知道怎么修改,因此将composer直接装入php扩展镜像。

报错的Dockerfile
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev && docker-php-source extract && docker-php-source delete && docker-php-ext-install gd && docker-php-ext-install zip && docker-php-ext-install mysqli && docker-php-ext-install pdo_mysql && docker-php-ext-install opcache && curl 'http://pecl.php.net/get/mcrypt-1.0.2.tgz' && pecl install mcrypt-1.0.2.tgz && curl 'http://pecl.php.net/get/memcached-3.1.3.tgz' && pecl install memcached-3.1.3.tgz && curl 'http://pecl.php.net/get/redis-4.2.0.tgz' && pecl install redis-4.2.0.tgz && cd ~ && php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && chmod +x composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer && composer config -g repo.packagist composer https://packagist.phpcomposer.com && composer selfupdate && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/*

运行并连接容器

# docker run --name laravel-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /etc/laravel.docker.d/mysql/etc/mysql:/etc/mysql -v/etc/laravel.docker.d/mysql/var/lib/mysql:/var/lib/mysql -d mysql:5.7
# docker run --name laravel-php -v /var/www/html:/var/www/html -v /etc/laravel.docker.d/php/etc:/usr/local/etc --link laravel-mysql:mysql -d php-ext:0.1
# docker run --name laravel-nginx -v /var/www/html:/usr/share/nginx/html -v /etc/laravel.docker.d/nginx/etc/nginx:/etc/nginx -v /var/log/nginx:/var/log/nginx -p 80:80 --link laravel-php:php -d nginx:latest

建立phpinfo.php并测试

# cd /var/www/html && vi phpinfo.php
内容:
<?php
phpinfo();
?>

启动phpmyadmin镜像

# docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest

生成laravel项目

# cd /var/www/html
# composer create-project laravel:laravel 项目名