Как удалить цель символической ссылки в скрипте Gitlab CI?

У меня проблема с настройкой .gitlab-ci.yml файл. Я хочу удалить старые коммиты, поэтому на сервере (Debian) доступны только самые последние и предыдущие коммиты.

По какой-то причине, когда скрипт выполняется, он не работает должным образом - коммиты переключаются правильно, но старый сохраняется в папке и не удаляется с помощью rm -rf $(readlink <link>)

Однако, если я использую SSH на сервере с тем же пользователем и выполняю те же действия, rm -rf $(readlink <link>) успешно удаляет фактическую цель символической ссылки (ожидаемое поведение). Когда то же самое делается из скрипта CI, цель не удаляется.

Может быть, я пропустил некоторую переменную или скобки?

Это мой (подрезанный) .gitlab-ci.yml файл:

variables:
    SSH_USER: "user@server"
    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: "user@server"
    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 символические ссылки на коммиты

У кого-нибудь есть похожая проблема? Или вы используете другие методы для удаления старых (больше не нужно) коммитов?

1 ответ

Решение

Наконец-то нашел решение - это был плохой выход из спины

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
Другие вопросы по тегам