Gogs私有git倉庫 + Drone構建CI/CD平台
前提
- 安裝有docker、docker-compose
- 安裝有git
- 安裝有mysql
使用docker-compose安裝gogs、Drone(建議先看完文章)
# 拉取代碼:
git clone https://github.com/alicfeng/gogs-drone-docker.git
## 在 .drone.yml中,把 - DRONE_USER_CREATE=username:${DRONE_ADMIN},admin:true
## 改為 DRONE_USER_CREATE=username:admin,admin:true
## 不寫一個用戶的話,會導致無法觸發自動構建任務。
# 進入項目目錄,然后使用docker-compose運行
cd gogs-drone-docker && docker-compose up -d
ps: 安裝報錯解決:
error:
ERROR: Network ev-dev-network declared as external, but could not be found. Please create the network manually using `docker network create ev-dev-network` and try again.
執行命令:
docker network create ev-dev-network
初始化gogs
參照文章:http://www.mdslq.cn/archives/1a623683.html
按照里面的圖進行gogs初始化
配置Drone自動構建Spring boot項目
拉取項目代碼
地址:https://github.com/Famine-Life/Springboot-helloworld-drone
編寫 .rone.yml 文件,用來構建自動構建任務
# drone 本地構建
kind: pipeline
type: docker
name: MyHelloWorld
# drone構建步驟
steps:
# 1.maven打包
- name: maven compile
pull: if-not-exists
image: maven:ibmjava-alpine
volumes:
# maven構建緩存
- name: cache
path: /root/.m2
# 掛載宿主機的目錄
- name: data
path: /home
commands:
# 開始打包maven工程
- ls
# - cd springboot-helloworld
- mvn clean package -Dmaven.test.skip=true
# 將打包后的文件復制到宿主機映射目錄
- cp target/*.jar /home
- cp Dockerfile /home
# 2.使用ssh訪問主機制作鏡像並運行
- name: ssh commands
pull: if-not-exists
image: appleboy/drone-ssh:1.5.7
settings:
host: 60.205.254.71
username: root
password:
# 從drone倉庫配置中秘密空間讀取密碼
from_secret: ssh_password
port: 22
# 注意把下面的 springboot-helloworld 改成自己項目mvn pkg會生成的jar包名稱
script:
- echo =======暫停容器=======
- docker stop `docker ps -a | grep springboot-helloworld | awk '{print $1}' `
- echo =======暫停舊容器和鏡像=======
- docker rm -f `docker ps -a | grep springboot-helloworld | awk '{print $1}' `
- docker rmi `docker images | grep springboot-helloworld | awk '{print $3}' `
- echo =======開始構建新鏡像=======
- cd /data/drone/helloDemo
- docker build -t springboot-helloworld:latest .
- echo =======鏡像列表,如果服務器鏡像太多建議注釋=======
- docker images
- echo =======開始部署應用=======
- docker run -d -p 8080:8080 --name springboot-helloworld springboot-helloworld:latest
- echo =======清理構建文件,建議保留=======
#- rm -rf *
- echo =======部署成功=======
# 3.釘釘通知 (注釋掉,沒測試過)
# - name: dingTalk notification
# pull: if-not-exists
# image: guoxudongdocker/drone-dingtalk:latest
# settings:
# token:
# from_secret: dingtalk_token
# type: markdown
# message_color: true
# message_pic: true
# sha_link: true
# when:
# status: [failure, success]
# 掛載的主機卷,可以映射到docker容器中
volumes:
# maven構建緩存
- name: cache
host:
# path: /tmp/cache/.m2
path: /var/lib/cache
# maven構建后與宿主機通信的共享目錄
- name: data
host:
path: /data/drone/helloDemo
# drone執行觸發器
trigger:
branch:
- master
注意事項:
- 在drone項目中配置,配置ssh_passworld(也就是服務器的遠程連接密碼。drone官網也有提供配置ssh key的配置)

-
把host: 60.205.254.71改成你的ip
-
配置文件中的路徑:/var/lib/cache 、/data/drone/helloDemo,drone竟然不會自動構建!!,假設我們的服務器該路徑不存在,它會報錯 (觀察第四點的log日志看出來的)...就無語 : P ,自行手動創建,或者直接寫存在的路徑。
-
最值得注意的一點:我發現ssh幫我們執行shell的時候,有些構建命令出錯、drone是不會提示執行失敗的。它有時候有不停的重復運行、或者也返回執行成功的標識,就很離譜。

-
如果push代碼后,並沒有生成構建任務,檢查兩點:
(1)在git倉庫設置中的管理web鈎子,可能會沒有填寫ip,點擊修改加上。並且點擊進去可以推送測試

(2)檢查drone項目的Trusted是否勾選

推送測試
demo搭建、運行完成后,下面在項目代碼中添加一個接口作為一個持續集成的測試。
在原有的 /hello下面,加上/test
@GetMapping("/test")
public String test() {
return "Hello Drone!";
}

然后,push到gogs的git庫:git push
構建信息:

-
不小心push了不需要的idea文件,clone代碼用了41秒
-
maven編譯由於java文件少、用了7秒
-
build鏡像到運行容器,用了13秒
(以上用時沒有什么意義,單純無聊了)
感受
-
因為安裝gogs、drone,用的docker,所以,當安裝失敗時候完全可以刪庫重來。
-
其次,配置自動構建任務只需要編寫yml文件,所有的環境都從docker鏡像來,比起jenkins要配置各種東西,簡直不要太舒服。
-
最后一點,目前我沒有搭建有docker私有倉庫,如果公司有搭建私有倉,那么構建鏡像push到私有倉,剩下的就交給運維吧。。
個人認為,Drone很簡便、並且也有超高的自由度。
