2016-01-29 50 views
6

我打算部署使用GitLab CI服務器簡單的Spring啓動應用程序。我.gitlab-ci.yml如下:如何使用GitLab亞軍啓動一個服務,並防止它停止?

stages: 
    - build_and_test 
    - deploy 

web_server_build_and_test: 
    stage: build_and_test 
    script: 
    - mvn clean package 

web_server_deploy: 
    stage: deploy 
    script: 
    - mvn clean package -Pprod 
    - service gitlab-runner-test stop 
    - cp target/*.war /var/gitlab-runner-test/gitlab-runner-test.war 
    - chmod +x /var/gitlab-runner-test/gitlab-runner-test.war 
    - service gitlab-runner-test start 

而且deploy階段產生以下的輸出:

$ service gitlab-runner-test stop 
Stopped [13247] 
$ cp target/*.war /var/gitlab-runner-test/gitlab-runner-test.war 
$ chmod +x /var/gitlab-runner-test/gitlab-runner-test.war 
$ service gitlab-runner-test start 
Started [21177] 

不過,我無法加載應用程序,因爲該服務已停止,一旦選手衝線階段:

$ service gitlab-runner-test status 
Not running (process 21177 not found) 

我的服務腳本代表工作實際組裝war包:

#!/usr/bin/env bash 

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/bin/java 
export MODE=service 
export APP_NAME=gitlab-runner-test 
export PID_FOLDER=/var/run/gitlab-runner-test 


/var/gitlab-runner-test/gitlab-runner-test.war $* 

而且,當我用手啓動服務時(service gitlab-runner-test start),即使用戶會話已關閉,它仍然保持運行狀態。

我不確定,問題的根源是什麼 - Spring Boot啓動腳本,GitLab配置,我的服務腳本還是別的?

我運行Ubuntu 14.04與GitLab CI多亞軍版本0.5.0(c38415a)。

UPD:

升級轉輪版本1.0.1(cffb5c7)不解決問題。

回答

9

爲什麼這是一個壞主意,做...

由於其文檔中明確規定,在GitLab Runner「運行測試並將結果發送到GitLab」。

而作爲測試應及時啓動和停止,流道設計完成每個生成後殺死所有創建的進程。

因此,這不是一個錯誤您的服務被殺害,這是一個功能。 )對於部署


GitLab CI文檔recommends using dpl

dpl是一個項目,可讓您在各種PaaS提供程序(例如Google App Engine,Heroku或Elastic Beanstalk)上部署您的應用程序。

因此,它激發了一些REST API的請求,或者通過互聯網推送了一些其他數據,並且它的過程很好地退出。


所以,做你想要做的其實什麼需要一些黑客 - 覆蓋默認亞軍行爲。你不應該做它作爲一個長期的解決方案,因爲它可能會停止與一些運動員/ gitlab更新工作。

...但如果你堅持,那麼這裏是如何做:)

在你的情況下,如果要真正地部署和你的跑步者的主機本身上運行的應用程序,我們需要使用兩個黑客:

好了,所以這裏的說明:

  1. 確保您可以從您的亞軍主機的SSH自己在/root/.ssh/id_rsa一個SSH私鑰,無密碼,不確認指紋。 ssh localhost運行root應該非交互式工作。

  2. 編輯您的gitlab亞軍的配置文件,/etc/gitlab-runner/config.toml,使它看起來像這樣:

    [[runners]] 
        name = "your-runner-name" 
        url = "https://<your_gitlab_instance_fqdn>/ci" 
        token = "<your_project_CI_token>" 
        tls-ca-file = "" 
        executor = "ssh" 
        [runners.ssh] 
        user = "root" 
        password = "" 
        host = "localhost" 
        port = "22" 
        identity_file = "/root/.ssh/id_rsa" 
    

(亞軍將保存配置文件後自動重新加載)

  • 編輯您的服務腳本,使其創建的進程不會是init腳本的子進程,並且不會打開stdin,stdout和stderr:

    #!/usr/bin/env bash 
    
    export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/bin/java 
    export MODE=service 
    export APP_NAME=gitlab-runner-test 
    export PID_FOLDER=/var/run/gitlab-runner-test 
    
    
    /var/gitlab-runner-test/gitlab-runner-test.war $* <&- >&- 2>&- & disown 
    
  • 測試通過重試上次編譯或作出承諾項目回購。


    PS我測試了我的init腳本會看起來像這樣的解決方案:

    #!/usr/bin/env bash 
    
    start() { 
        # Completely disowned process, not a child 
        # Credits: Joe at https://stackoverflow.com/a/26420299/2693875 
        sleep 99999 <&- >&- 2>&- & disown 
        exit 0 
    } 
    
    stop() { 
        echo "doing nothing" 
        exit 0 
    } 
    
    echo "running on $HOSTNAME..." 
    
    case "$1" in 
        start) 
        start 
        ;; 
        stop) 
        stop 
        ;; 
        *) 
        echo $"Use this options $0 {start|stop}" 
        exit 1 
    esac 
    

    ..on的Ubuntu 14.04與gitlab的多亞軍v 1.02和GitLab CE 8.5.0。

    +0

    謝謝!我一上班就會檢查你的解決方案。是否需要以root身份運行runner? – soon

    +0

    因此,如果通過GitLab CI進行部署是個不好的主意,那麼我不應該爲dpl編寫自定義提供程序嗎? – soon

    -1

    儘管由@GregDubicki發佈的解決方案非常完美,並且包含每個步驟的解釋,但我最終還是得到了一個獨立的監測服務,它會在每次構建後重新啓動我的服務。

    這種方法具有以下優點:

    1. 你不應該開始轉輪下root用戶
    2. 你不應該在乎過程,由亞軍殺死
    3. (+獎金)你有一個監控系統現在!