使用gogs,drone搭建自動部署
使用gogs,drone,docker搭建自動部署測試環境
Gogs是一個使用go語言開發的自助git服務,支持所有平台
Docker是使用go開發的開源容器引擎
Drone是一個基於容器技術的持續集成平台。每個構建都在一個臨時的Docker容器中執行,使開發人員能夠完全控制其構建環境並保證隔離。drone易於安裝和使用,其目標是替代jenkins
本文所實現的的功能為當你push代碼到gogs時,自動更新您測試環境的二進制文件並重啟,實現自動部署(以go開發api服務為例,測試環境為ubuntu)
整個流程為:
- push code
- drone搭建臨時容器拉取最新代碼編譯,在臨時容器內通過scp拷貝編譯好的二進制文件至測試服務器,然后通過ssh控制測試環境應用服務重啟(supervisorctl)
步驟(ubuntu)
默認已經安裝好gogs和docker,以及使用supervisor部署應用服務(可選為其他部署方式)
- 安裝docker
具體安裝步驟可見官網文檔 - 安裝gogs
官網安裝文檔(需FQ,也可自行搜索相關安裝文檔) - 安裝drone(v0.5)
通過docker安裝-
下載drone鏡像
docker pull drone/drone:0.5 -
啟動drone server
該命令啟動的是一個以sqlite做為存儲數據庫,可選配mysql,postgres可根據自己情況進型配置,見文檔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
drone啟動成功,可以通過網頁訪問,使用gogs賬號登錄,找到項目開啟管理。 -
啟動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
-
- 生成定制golang鏡像(在.drone.yml配置置該鏡像作為構建鏡像)
- pull一個base鏡像
docker pull goang:latest 可選擇版本 - 定制鏡像
- 創建並啟動golang容器
docker run --ti golang:latest /bin/bash - 生成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免密密登錄已配置好
准備好之后退出容器,並把在容器里面的修改保存為一個新的鏡像
如:docker commit [容器id] golang:dev
- 創建並啟動golang容器
- pull一個base鏡像
-
在項目根路徑添加.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代碼便會自動構建部署了
