2017-11-30 35 views
1

.gitlab-ci.yml 파일을 설정할 때 문제가 있습니다. 이전 커밋을 지우고 싶습니다. 따라서 (Debian) 서버에서 최신 커밋과 이전 커밋 만 사용할 수 있습니다. 커밋이 제대로 전환되지만, 이전 폴더에 유지하고있는 경우, 그러나 rm -rf $(readlink <link>)Gitlab CI 스크립트의 심볼릭 링크 대상을 삭제하는 방법은 무엇입니까?

으로 삭제되지 않습니다 - 어떤 이유로, 스크립트가 실행될 때, 그것은 예상대로 작동하지 않습니다를 들어

동일한 SSH 서버에서 동일한 사용자와 동일한 단계를 수행하면 rm -rf $(readlink <link>)은 실제 symlink 대상 (예상되는 동작)을 성공적으로 삭제합니다. CI 스크립트에서 동일한 작업을 수행하면 대상이 삭제되지 않습니다.

어쩌면 일부 변수가 빠져 나오거나 괄호가 필요하지 않습니까?

이 내 (트리밍) .gitlab-ci.yml 파일입니다

variables: 
    SSH_USER: "[email protected]" 
    PROJECT_DIR: "/domains/example.com/project-name" 
    DEPLOY_DIR: "${PROJECT_DIR}/deploy" 
    STAGING_TEMP_DIR: "${PROJECT_DIR}/staging-temp" 
    # is this correct? 
    DELETE_STAGING_TEMP: "'$$(readlink -f ${STAGING_TEMP_DIR})'" 

stages: 
    - build 
    - deploy 
    - post-deploy 

Post Deploy staging: 
    stage: post-deploy 
    script: 
     # switch last version 
     - ssh $SSH_USER mv ${PROJECT_DIR}/staging-previous ${STAGING_TEMP_DIR} || true 
     - ssh $SSH_USER mv ${PROJECT_DIR}/staging-latest ${PROJECT_DIR}/staging-previous || true 
     - ssh $SSH_USER rm -rf ${DELETE_STAGING_TEMP} 
     - ssh $SSH_USER unlink ${STAGING_TEMP_DIR} || true 
     - ssh $SSH_USER ln -s ${DEPLOY_DIR}/${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA} ${PROJECT_DIR}/staging-latest 

내가이 변형을 시도 :

variables: 
    SSH_USER: "[email protected]" 
    PROJECT_DIR: "/domains/example.com/project-name" 
    DEPLOY_DIR: "${PROJECT_DIR}/deploy" 
    STAGING_TEMP_DIR: "${PROJECT_DIR}/staging-temp" 

Post Deploy staging: 
    stage: post-deploy 
    script:    
     # switch last version 
     - ssh $SSH_USER mv ${PROJECT_DIR}/staging-previous ${STAGING_TEMP_DIR} || true 
     - ssh $SSH_USER mv ${PROJECT_DIR}/staging-latest ${PROJECT_DIR}/staging-previous || true  
     # is this correct? 
     - ssh $SSH_USER rm -rf "$(readlink -f ${STAGING_TEMP_DIR})" 
     - ssh $SSH_USER unlink ${STAGING_TEMP_DIR} || true 
     - ssh $SSH_USER ln -s ${DEPLOY_DIR}/${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA} ${PROJECT_DIR}/staging-latest 

그냥 참고 : ${PROJECT_DIR}/staging-previous${PROJECT_DIR}/staging-latest 커밋하는 심볼릭 링크입니다.

비슷한 문제가있는 사람이 있습니까? 또는 오래된 (더 이상 필요하지 않은) 커밋을 삭제하는 다른 방법을 사용합니까?

답변

0

마지막으로 해결책을 발견 - 그것은 역 따옴표의`나쁜 탈출했다

Post Deploy STAGING: 
    stage: post-deploy 
    script: 
     # checks if current commit is already set up as staging-latest 
     # if not, then this is new release, so switch last version: 
     # - move staging-previous to temp 
     # - move staging-latest to staging-previous 
     # - delete the content of temp dir and unlink temp 
     - > 
      ssh $SSH_USER "if [ \"\`readlink ${PROJECT_DIR}/staging-latest\`\" != \"${DEPLOY_DIR}/${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}\" ]; 
      then \`mv ${PROJECT_DIR}/staging-previous ${STAGING_TEMP_DIR} || true; 
      mv ${PROJECT_DIR}/staging-latest ${PROJECT_DIR}/staging-previous || true\`; 
      rm -rf \`readlink -f ${STAGING_TEMP_DIR}\`; 
      unlink ${STAGING_TEMP_DIR} || true; 
      fi;" 
     - ssh $SSH_USER ln -s ${DEPLOY_DIR}/${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA} ${PROJECT_DIR}/staging-latest || true