gitlab自动部署PHP、NODE工程到生产服务器

meShell · 2019-10-16

最近为项目加上了持续集成(CI)。这样您可以在推送版本控制存储库后自动运行任务,例如代码测试或部署。这篇文章向您展示了如何使用GitLab进行自动任务和生产服务器的部署过程。

如果你以前使用的是Github,相信你也使用过travis它是一个第三方的工程。不同与Github, Gitlab是自带CI套件的,你可以免费的使用它。

在使用Gitlab CI之前,你需要在你的工程根目录建立.gitlab-ci.yml文件。在文件中写入任务流指令集即可完成自动任务和部署功能。在仓库提交之后CI Runner 会自动执行指令集。我们选以tags为触发条件,在仓库打上tag后执行:

  1. ssh连接到生产服务器.
  2. 创建以当前工程名的目录.
  3. 在工程名目录接取仓库并以当前时间为项目名(也就是目录名称).
  4. 执行composer installnpm install 和改变必要的目录用户组.
  5. 建立以当前版本目录的软链.
  6. 删除过期的版本目录.

创建.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步完成整个作业。

  1. 建立项目名称目录
  2. 拉取项目以时间为版本号目录
  3. 更新项目依赖,构建生产代码
  4. 建立新的软链接
  5. 删除旧的发布代码,保留最近三个

推荐阅读

  1. https://docs.gitlab.com/ee/ci/variables/README.html
  2. https://docs.gitlab.com/ee/ci/yaml/README.html
  3. https://docs.gitlab.com/ee/ci/examples/deployment/composer-npm-deploy.html