m
gitlab自动部署PHP、NODE工程到生产服务器
最近为项目加上了持续集成(CI)。这样您可以在推送版本控制存储库后自动运行任务,例如代码测试或部署。这篇文章向您展示了如何使用GitLab进行自动任务和生产服务器的部署过程。
如果你以前使用的是Github,相信你也使用过travis
它是一个第三方的工程。不同与Github
, Gitlab
是自带CI
套件的,你可以免费的使用它。
在使用Gitlab CI
之前,你需要在你的工程根目录建立.gitlab-ci.yml
文件。在文件中写入任务流指令集即可完成自动任务和部署功能。在仓库提交之后CI Runner
会自动执行指令集。我们选以tags
为触发条件,在仓库打上tag
后执行:
- ssh连接到生产服务器.
- 创建以当前工程名的目录.
- 在工程名目录接取仓库并以当前时间为项目名(也就是目录名称).
- 执行
composer install
和npm install
和改变必要的目录用户组. - 建立以当前版本目录的软链.
- 删除过期的版本目录.
创建.gitlab-ci.yml
文件
就像上面说得,我们需要创建一个.gitlab-ci.yml
才能进作业。可以将任务分组为在不同阶段运行作业。这里我们只需要一个deploy
阶段。文件的开头看起来像这样:
before_script:
- echo $CI_PROJECT_DIR
- export VERSION=`date "+%Y%m%d-%H%M%S"`
- echo $VERSION
- export PROJECT_NAME=`basename ${CI_PROJECT_DIR}`
- echo $PROJECT_NAME
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan 8.8.8.8 >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
variables:
PROJECT_SSH_URL: "git@gitlab.com:example/example.git"
SSH_USER: "example"
SSH_HOST: "example.com"
stages:
- deploy_online
deploy_online:
stage: deploy_online
only:
- tags
environment:
name: production
script:
- ssh $SSH_USER@$SSH_HOST "mkdir -p /var/www/releases/${PROJECT_NAME}" # 建立目录
- ssh $SSH_USER@$SSH_HOST "cd /var/www/releases/${PROJECT_NAME} && git clone ${PROJECT_SSH_URL} ${VERSION} && chown -R nobody:nobody ./${VERSION}/storage/" # 拉取代码,设置目录用户组
- ssh $SSH_USER@$SSH_HOST "cd /var/www/releases/${PROJECT_NAME}/${VERSION} && composer install --no-dev && npm install --save-dev --allow-root && cd src && npm run build:prod" # 安装依赖 构建生产代码
- ssh $SSH_USER@$SSH_HOST "ln -sfn /var/www/releases/${PROJECT_NAME}/${VERSION} /var/www/webapps/${PROJECT_NAME}" # 建立软链接
- ssh $SSH_USER@$SSH_HOST "cd /var/www/releases/${PROJECT_NAME} && rm -rf \`ls -t | tail -n +4\` && exit" # 删除旧的文件,只保留最近三个文件夹
我们定义了deploy_online
工作阶段。使用before_script
可以在任务运行之前执行一些脚本。上面的示例配置中,导入了一个VERSOIN
, PROJECT_NAME
变量和SSH
连接和必要配置。你可以通过这里查看SSH连接配置具体说明。$SSH_PRIVATE_KEY
是在Gitlab设置一个变量,该变量存储SSH私钥。设置完私钥后,你必须把公钥添加到服务器的~/.ssh/authorized_keys
文件中。
在作业指令中,我们指定了只有推送了tags
才会触发作业。作业脚本中5步完成整个作业。
- 建立项目名称目录
- 拉取项目以时间为版本号目录
- 更新项目依赖,构建生产代码
- 建立新的软链接
- 删除旧的发布代码,保留最近三个