使用gogs,drone搭建自動部署


使用gogs,drone搭建自動部署

使用gogs,drone,docker搭建自動部署測試環境

Gogs是一個使用go語言開發的自助git服務,支持所有平台
Docker是使用go開發的開源容器引擎
Drone是一個基於容器技術的持續集成平台。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境並保證隔離。drone易於安裝和使用,其目標是替代jenkins

本文所實現的的功能為當你push代碼到gogs時,自動更新您測試環境的二進制文件並重啟,實現自動部署(以go開發api服務為例,測試環境為ubuntu)

整個流程為:

  1. push code
  2. drone搭建臨時容器拉取最新代碼編譯,在臨時容器內通過scp拷貝編譯好的二進制文件至測試服務器,然后通過ssh控制測試環境應用服務重啟(supervisorctl)

步驟(ubuntu)

默認已經安裝好gogs和docker,以及使用supervisor部署應用服務(可選為其他部署方式)

    1. 安裝docker
      具體安裝步驟可見官網文檔
    2. 安裝gogs
      官網安裝文檔(需FQ,也可自行搜索相關安裝文檔)
    3. 安裝drone(v0.5)
      通過docker安裝
      1. 下載drone鏡像

        docker pull drone/drone:0.5 
      2. 啟動drone server

         docker run -d \
            -e DRONE_GOGS=true \ -e DRONE_GOGS_URL=http://127.0.0.1:3000 \ //gogs服務器地址 -e DRONE_SECRET=... \ -e DRONE_OPEN=true \ -v /var/lib/drone:/var/lib/drone \ -p 80:8000 \ --restart=always \ --name=drone \ drone/drone:0.5
        該命令啟動的是一個以sqlite做為存儲數據庫,可選配mysql,postgres可根據自己情況進型配置,見文檔
        drone啟動成功,可以通過網頁訪問,使用gogs賬號登錄,找到項目開啟管理。
      3. 啟動drone agent

         docker run -d \
            -e DRONE_SERVER=ws://172.17.0.1/ws/broker \ //server 地址 -e DRONE_SECRET=... \ //與server一致 -v /var/run/docker.sock:/var/run/docker.sock \ --restart=always \ --name=drone-agent \ drone/drone:0.5 agent
    4. 生成定制golang鏡像(在.drone.yml配置置該鏡像作為構建鏡像)
      1. pull一個base鏡像
        docker pull goang:latest 可選擇版本
      2. 定制鏡像
        1. 創建並啟動golang容器
          docker run --ti golang:latest /bin/bash
        2. 生成ssh公鑰,並設置ssh免密登錄測試服務器
          容器內:
          • 執行ssh-keygen -t rsa
          • 會在$HOME/.ssh目錄下生成id_rsa和id_rsa.pub
          • 將id_rsa.pub通過scp拷貝至測試服務器
            測試服務器:
          • 在home目錄下建立.ssh文件夾
          • 並cat id_rsa.pub >> .ssh/authorized_keys
          • chmod 600 .ssh/authorized_keys
            ssh免密密登錄已配置好
          下載自己項目需要的依賴包 go get ...(官方golang鏡像的GOPATH為/go)
          准備好之后退出容器,並把在容器里面的修改保存為一個新的鏡像
          如:docker commit [容器id] golang:dev
    5. 在項目根路徑添加.drone.yml文件
      配置示例:

      workspace:  base: /root/go  path: src/projectname pipeline:  build:  image: golang:dev //指定構建鏡像  environment:  - GOPATH=/go:/root/go  - SSH_ARGS=-p 22 -o StrictHostKeyChecking=no(設置第一次登錄時不需要輸入yes)  - SCP_ARGS=-P 22 -o StrictHostKeyChecking=no  - BUILD_NAME=buildname  - APP_NAME=appname  - TEST_SERVER=root@172.17.0.1  - RUN_PATH=/data/go/project(配置自己測試環境應用保存運行地址)  commands:  - go build -o $BUILD_NAME  - eval $(ssh-agent -s)  - ssh-add /root/.ssh/id_rsa  - scp $SCP_ARGS "$BUILD_NAME" "$TEST_SERVER":"$RUN_PATH"/"$BUILD_NAME"_"$(date '+%Y%m%d')"_"$(git rev-parse HEAD| cut -c1-10)" //拷貝文件  - ssh $SSH_ARGS "$TEST_SERVER" "ln -s -f $RUN_PATH/$BUILD_NAME\_$(date '+%Y%m%d')_$(git rev-parse HEAD| cut -c1-10) $RUN_PATH/$BUILD_NAME && supervisorctl restart $APP_NAME" //重啟,利用軟連接實現備份
      • workspace: 工作路徑,根據如上配置,會把你的項目克隆到 /root/go/projectname, 且$PWD=/root/go/projectname
      • image: 指定構建鏡像
      • environment: 構建臨時容器的環境變量,相當於 docker run -e .....
      • commands: 在容器內shell上執行的命令

      上面配置文件中設置了兩個GOPATH是因為在之前的測試中,如果我設置
      base/root
      GOPATH=/go
      會把之前鏡像下載的依賴包給清空了,不知是哪里配錯了還是什么原因,暫時只找到設置另個GOPATH的方法來解決

      編寫好.drone.yml后加入倉庫push代碼便會自動構建部署了


免責聲明!

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



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