詳細検索

Capistrano 3 작업 내에서 최상위 작업 이름 받아보세요

아바타
글쓴이 maeno
3분 읽기

Capistrano 3 작업 내에서 최상위 작업 이름 받아보세요
日本語에서 번역 • 원문 보기

Capistrano3에서 작업을 작성할 때, 최상위 작업 이름을 얻기 어려웠는데, 그 이유는 작업 내에서 캡 명령어로 실행된 최상위 작업 이름을 빼는 것이 어려웠기 때문입니다.

기본적으로 Capistrano3에서 작업 이름에 작업 이름을 넣고 싶다면, 다음과 같이 블록에 인수로 그릴 수 있습니다:

DESC "주요 과제" 
작업 :main_task => :sub_task 수행 |task|
    run_locally 그래
        info ": 이 작업 이름: #{task}" 
        정보 ": 메인 배포 작업 실행 중!" 
    끝
끝

desc "하위 작업" 
작업 :sub_task 하는 |task|
    run_locally 그래
        current_task = task.name_with_args.split(':').last
        정보 ": 이 작업 이름: #{current_task}" 
    끝
끝

위 작업을 수행하면 다음과 같이 보입니다.

$ cap test deploy:main_task
정보: 이 작업 이름: sub_task
정보: 이 작업 이름: deploy:main_task
정보: 메인 배치 작업 실행 중! 

하지만 배포의 공통 구성을 읽는 서브태스크를 만들고 주요 작업 전에 하위 작업을 실행하는 작업 체인을 만들고, 특정 메인 작업이 실행될 때만 일부 하위 작업을 분기하고 싶다면, 하위 작업 내에서 메인 작업의 작업 이름을 받아야 합니다. 즉, 저는 cap 명령어로 최상위 작업(예시의 주요 작업)을 실행하고 싶었지만, 이를 위한 TIPS를 찾기가 어려웠습니다. Capistrano의 작업 처리는 코어에서 사용되는 Rake 클래스로 구현되어 있어서, 그 Rake 클래스의 Application 메서드에서 가져와야 했습니다.

최상위 작업을 분기한 하위 작업 예시:

desc "main task1 : initialize" 
task :initialize => :set_options Do
    run_locally 그래
        정보 ": 배포를 위한 초기화 실행 중" 
    끝
끝

설명 "주요 임무2: 배치" 
작업 :d eployment => :set_options do
    run_locally 그래
        정보 ": 실행 중인 애플리케이션 배포!" 
    끝
끝

desc "공통 하위 작업 : 옵션 설정" 
과제 :set_options 하 |task|
    Set :top_level_task, task.application.top_level_tasks.Last.Split(':').LAST

    run_locally 그래
        info ": 최상위 작업 이름: #{fetch(:top_level_task)}" 
        만약 (fetch(:top_level_task) == '초기화')
            정보 ": main-task가 초기화되면, 이 작업이 실행됩니다." 
        그렇지 않으면
            정보 ": 배치라는 주요 임무의 경우 해당 작업을 수행하라." 
        끝
    끝
끝

위 과제의 결과는 다음과 같습니다

$ cap test deploy:initialize
정보: 최상위 작업 이름: 초기화
INFO: main-task가 initialize로 명명되어 있으면, 이 작업이 실행 중입니다. 
정보: 배포를 위한 초기화 실행 중
$ cap test deploy:deployment
정보: 최상위 작업 이름: 배치
정보: 주요 임무인 배치의 경우 해당 작업을 수행하세요. 
정보: 애플리케이션 배포 실행 중! 

그리고 한 개의 하위 작업만 처리하는 방식이 다르다는 점도 알 수 있는데, 이는 하나라도 최상위 작업(주요 작업)이 다르기 때문입니다.

작업을 잘라내고 일상화할 때는 'Rake::Application.top_level_tasks' 방법이 매우 유용합니다.

Related Articles