gitlab之gitlab-runner自動部署(二)


  • 轉載自:https://blog.csdn.net/hxpjava1/article/details/78514999
  • 簡介

  • gitlab-ci全稱是gitlab continuous integration的意思,也就是持續集成。中心思想是當每一次push到gitlab的時候,都會觸發一次腳本執行,然后腳本的內容包括了測試,編譯,部署等一系列自定義的內容。本文就是利用gitlab-ci的持續集成來實現自動部署。相比之前webhook的自動部署還是強大以及方便了許多。
  • 原理

  • 自動部署涉及了若干個角色,主要介紹如下
  • GitLab-CI 這個是一套配合GitLab使用的持續集成系統,是GitLab自帶的,也就是你裝GitLab的那台服務器上就帶有的。無需多考慮。.gitlab-ci.yml的腳本解析就由它來負責。

  • GitLab-Runner 這個是腳本執行的承載者,.gitlab-ci.yml的script部分的運行就是由runner來負責的。GitLab-CI瀏覽過項目里的.gitlab-ci.yml文件之后,根據里面的規則,分配到各個Runner來運行相應的腳本script。這些腳本有的是測試項目用的,有的是部署用的。

    GitLab-CI與GitLab-Runner關系示意圖

  • .gitlab-ci.yml 這個是在git項目的根目錄下的一個文件,記錄了一系列的階段和執行規則。GitLab-CI在push后會解析它,根據里面的內容調用runner來運行。
  • 步驟

  • 安裝GitLab-CI 這個不用安裝了,裝好GitLab就自帶了
  • 安裝GitLab-Runner 在centOS上安裝gitlab-ci-multi-runner

    這樣就裝好了gitlab-ci-multi-runner,然而我們只是裝好了gitlab-runner,當然我們要接着向gitlab-CI注冊這個runner,不然gitlab-CI在push事件到來的時候怎么知道要調用誰呢?這里也可以發現和webhook方式的區別,webhook方式是我們主動配置了一個連接給gitlab;gitlab-runner只要注冊一下就好了。

    那么我們就注冊一下

    然后就注冊好了,在gitlab中相應的位置就可以看到你注冊好的runner信息。

    • $ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

    • $ yum install gitlab-ci-multi-runner

    • $ gitlab-ci-multi-runner register

    • #引導會讓你輸入gitlab的url,輸入自己的url,例如http://gitlab.example.com/

    • #引導會讓你輸入token,去相應的項目下找到token,例如ase12c235qazd32

    • #引導會讓你輸入tag,一個項目可能有多個runner,是根據tag來區別runner的,輸入若干個就好了,比如web,hook,deploy

    • #引導會讓你輸入executor,這個是要用什么方式來執行腳本,圖方便輸入shell就好了。

  • 編寫.gitlab-ci.yml
    在項目根目錄下編寫.gitlab-ci.yml這樣在push之后,gitlab-ci就會自動識別來解析了

  • stages:
      - deploy
      - build
      - ops
     
    deploy-web1_job:
      stage: deploy
      tags:
        - gitRunner的tag標簽
      only:
        - master
      script:
        - bash deploy 項目分組名 項目名 master
     
    build-web1_job:
      stage: build
      tags:
        - gitRunner的tag標簽
      only:
        - master
      script:
        - source /etc/profile
        - cd /data/wwwroot/master/項目分組名/項目名
        - /data/wwwroot/apache-maven-3.6.0/bin/mvn clean package -Dmaven.test.skip=true
     
    ops-web1_job:
      stage: ops
      tags:
        - gitRunner的tag標簽
      only:
        - master
      script:
        - rm -f /data/wwwroot/tomcat/apache-tomcat-8.5.35/webapps/項目名.war
        - cp /data/wwwroot/master/項目分組名/項目名/target/項目名.war /data/wwwroot/tomcat/apache-tomcat-8.5.35/webapps/項目名.war
    

      

  • 這里我們只有一個stage是deploy。only指定了只有在master分支push的時候才會被執行。tags是shell,對應了剛才注冊runner的時候的tags。

    最重要的script部分deploy Example_Group Example_Project,這里是一條shell指令,為了方便通用性,deploy是我在服務器上編寫的一個腳本,傳入參數是Example_Group Example_Project分別是項目組名和項目名。執行這一條指令就能夠自動部署到/xxx/Example_Group/Example_Project的服務器目錄下。那么隨便什么項目都用這個格式去套就好了,這樣新項目的自動部署也不需要登錄到服務器上去修改了。

  • 編寫deploy腳本
    在gitlab-runner的~/.local/bin/目錄下新建deploy文件

  • $ su gitlab-runner

  • $ mkdir ~/.local/bin

  • $ cd ~/.local/bin

  • $ touch deploy
     

  • 並編輯成如下內容

  • if [ $# -ne 3 ]
    then
          echo "arguments error!"
          exit 1
    else
          deploy_path="/data/wwwroot/$3/$1/$2"
          if [ ! -d "$deploy_path" ]
          then
                  git clone "gitlab服務器地址:${1}/${2}.git" $deploy_path
              cd $deploy_path
                  git checkout $3
          else
                  cd $deploy_path
                  git pull
          fi
    fi
    • 這個腳本的大意就是,如果目錄不存在,那么就git clone一個,如果存在了就git pull一個到指定目錄下。這樣就達到了自動部署的目的。記得修改里面的gitlab.example.com的地址哦。

    加上執行權限,然后把這個腳本放在gitlab-runner的~/.local/bin下就可以生效了(為了不用寫難看的./deploy)

    $ chmod +x ~/.local/bin/deploy

    並且把~/.local/bin加到$PATH路徑中(用戶執行命令時候能夠查找到這個目錄),只要在~/.profile末尾加入這一句話

    PATH="$HOME/.local/bin:$PATH"
  • 配置ssh登錄
    上面的deploy腳本是用ssh方式來和gitlab聯系的。所以要給gitlab-runner這個用戶配置一個gitlab上能ssh的用戶。首先在gitlab-runner下生成一個密鑰對

  • $ mkdir ~/.ssh

  • $ cd ~/.ssh

  • $ ssh-keygen

  • # 提示輸入一直按回車默認就可以了

  • $ cat id_rsa.pub

    用cat查看公鑰,然后復制這一串公鑰。在gitlab中新建一個賬號比如叫gitlab-runner,把這個賬號添加到你的項目成員中,然后在這個賬號的user_profile里面,把公鑰粘貼進去就好了。總之就是把這個賬號配置成能用ssh登錄的。
  • 移交部署目錄權限
    有些同學可能說腳本執行失敗了,有一個原因是/var/example的所有者是root,gitlab-runner並沒有權限新建文件。所以我們把/var/example目錄的所有者交給gitlab-runner

    $ chown -hR gitlab-runner:gitlab-runner /var/www

    如果還是不成功,可以在服務器上手工deploy XX XX一次,第一次訪問這個服務器的時候,有個命令行提示是要把sign添加進已知服務器列表,需要手工輸入個yes。如果在服務器上能夠正常deploy,那么
    這樣就大功告成了。

  • 注:如果在發布運行的過程中一直報ssh的密鑰驗證不通過 則執行這個:   ssh-keyscan -H 服務器ip >> ~/.ssh/known_hosts

  • 嘗試一下git push到相應項目,然后到服務器上的目錄看一下是不是有了呢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM