stay hungry stay foolish
完整的gitlab ci一般都有stage用于部署应用。
部分应用没有采用docker方式部署的话,怎么可以快速通过ci串联部署?
简述:用ssh的方式进行ci控制和部署。
最终部署可以通过supervisor的方式进行部署,或者直接放后台。
| 变量名称 | 备注 | 
|---|---|
| TARGET_IP | 部署机器的IP | 
| TARGET_SSH_PORT | 部署机器ssh的端口 | 
| TARGET_SSH_USER | 部署机器ssh的用户名 | 
| var_id_rsa | 部署机器TARGET_SSH_USER用户的私钥变量,需要以前将私钥存到gitlab ci的环境配置变量里面 | 
.gitlab-ci.yml代码片段variables:
  TARGET_IP: 1.2.3.4
  TARGET_SSH_USER: user
  TARGET_SSH_PORT: 22
stages:
  - build
  - deploy
deploy_target:
  stage: deploy
  only:
    - <branch>
  script:
    - PATH_IDRSA=`find . -name 'id_rsa'`
    - echo -n "${var_id_rsa}" > ${PATH_IDRSA}
    - echo "check newworks connection."
    - bash -c "ping -c 1 ${TARGET_IP}"
    - REPO=`echo $CI_PROJECT_DIR | awk -F '/' '{print $NF}'`
    - GROUP=`echo $CI_PROJECT_DIR | awk -F '/' '{print $(NF-1)}'`
    - DOCKER_REPO="$GROUP/$REPO"
    # change keys Permissions 
    - bash -c "chmod 600 ${PATH_IDRSA}"
    # clear previous dir (Be Cautious!!)
    - bash -c "echo `ssh -i ${PATH_IDRSA} -p ${TARGET_SSH_PORT} -o StrictHostKeyChecking=no ${TARGET_SSH_USER}@${TARGET_IP} \"rm -rf ~/gitlab_projects/${DOCKER_REPO} 2> /dev/null\"`"
    # mkdir for scp code
    - bash -c "echo `ssh -i ${PATH_IDRSA} -p ${TARGET_SSH_PORT} -o StrictHostKeyChecking=no ${TARGET_SSH_USER}@${TARGET_IP} \"mkdir -p ~/gitlab_projects/${DOCKER_REPO}\"`"
    - CODE_ROOT_PATH=`dirname $(find . -name '.gitlab-ci.yml')`
    # scp code
    # first tar zip the code
    - mkdir -p /tmp && cd ${CODE_ROOT_PATH} && tar -czvf /tmp/${REPO}.tar.gz . && mv /tmp/${REPO}.tar.gz .
    - bash -c "scp -r -i ${PATH_IDRSA} -P ${TARGET_SSH_PORT} -o StrictHostKeyChecking=no ${CODE_ROOT_PATH}/${REPO}.tar.gz ${TARGET_SSH_USER}@${TARGET_IP}:/home/${TARGET_SSH_USER}/gitlab_projects/${DOCKER_REPO}"
    # unzip
    - CICD_COMMANDS="cd /home/${TARGET_SSH_USER}/gitlab_projects/${DOCKER_REPO} && tar -xzvf ${REPO}.tar.gz"
    - ssh -i ${PATH_IDRSA} -p ${TARGET_SSH_PORT} -o StrictHostKeyChecking=no ${TARGET_SSH_USER}@${TARGET_IP} "${CICD_COMMANDS}"
    - CICD_COMMANDS="whoami"
    - bash -c "echo `ssh -i ${PATH_IDRSA} -p ${TARGET_SSH_PORT} -o StrictHostKeyChecking=no ${TARGET_SSH_USER}@${TARGET_IP} \"${CICD_COMMANDS}\"`"