這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
部落格地址:yeqown.github.com
起因
因為生產需要最近又重新折騰了一下Jenkins和docker。主要目的是想自動編譯,打包,部署一些Golang的HttpServer。於是決定使用Jenkins來做這個持續整合的載體,選擇Jenkins出於兩點原因:
1. 以前就使用過,上手會更快
2. 社區比較成熟,外掛程式和文檔豐富
安裝Docker和Pull Jenkins鏡像
這一步,作為前置條件且不是本文主要要描述的步驟,因此略去。網上也有很多參考資料~
Jenkins & docker-compose配置
為了方便我才用了docker-compose這個工具,docker-compose 基礎可以參見我的docker-compose上手。這裡直接上配置:
version: '2'services: jenkins: container_name: jenkins-lts ports: - 9001:8080 - 50000:50000 image: jenkins/jenkins:lts volumes: - /home/worker/jenkins/jenkins_home:/var/jenkins_home
配置也是官方的樣本配置。
Note: 將宿主機的/home/worker/jenkins/jenkins_home掛載為容器的/var/jenkins_home目錄。這樣做的目的是,如果容器被不小心刪除也不至於Jenkins的資料丟失。
到這裡,我們只需要執行docker-compose up -d
便可以將Jenkins容器跑起來了,再配置一下Nginx,便可以直接存取到Jenkins頁面了,並進行初始化。
我的目錄結構如下:
➜ jenkins lltotal 8.0K-rw-rw-r-- 1 worker worker 220 May 2 17:19 docker-compose.ymldrwxrwxr-x 19 worker worker 4.0K May 3 15:53 jenkins_home➜ jenkins pwd/home/worker/jenkins➜ jenkins docker-compose up -d # 運行
Publish Over SSH配置
Publish Over SSH
配置,由於我們是通過docker啟動並執行Jenkins,因此要特別配置一下SSH,方便Jenkins部署項目。這裡先列出步驟:
- 安裝
Publish Over SSH
- 容器內ssh-keygen
- 配置
Publish Over SSH
- 配置Git倉庫部署公開金鑰 #這一步相當於拉取代碼的Credentials
Golang Build-env
因為預設的Jenkins鏡像是不帶有Go的編譯工具的,所以我們很有必要安裝一個Go
外掛程式Go-Plugin-Jenkins
具體步驟如下:
- 安裝Jenkins
Go
外掛程式
- 在全域工具配置中,安裝Go
- 在對應任務配置-> 構建環境項,選擇Go版本
這一步的詳細步驟可以在參考文獻第一條中查詢Setup Go Build Environment
Note: 官方文檔中說全域配置Go是在系統設定中進行的,但是我用的
Jenkins ver. 2.107.2
,這一項配置是在全域工具配置中。
如何打包部署
編寫一個makefile來打包項目,通過scp
來分發部署服務,這也是配置Publish Over SSH
的目的。
由於Jenkins鏡像不帶有make相關工具(甚至Vim也沒有),所以需要安裝Make及其相關工具。與此同時,如果項目使用了相關的依賴管理工具,因此還有必要去配置相關的GO環境變數。其中Go的安裝路徑在:
/var/jenkins_home/tools/org.jenkinsci.plugins.golang.GolangInstallation/$GOVERSION中。
這裡貼上我的Makefile
# To test, build, deploy offline-tasks# -: ignore this commnad error# @: no display current commnad to std output# Commnads declareGOCMD=goGOTEST=$(GOCMD) testGOBUILD=$(GOCMD) build# Params defineMAIN_PATH=../mainPACKAGE_PATH=../packagePACKAGE_BIN_PATH=../package/binBIN=offline-tasksFILENAME=offline-tasks.tar.gz# Deploy ParamsDEV_HOST=zy-devDEV_TAR_PATH=/home/worker/project/offline-tasksPROD_HOST=zy-pro2PROD_TAR_PATH=/home/worker/project/offline-tasksdefault: build packtest: # testing - $(GOTEST) ../... -vbuild: # building mkdir $(PACKAGE_PATH) mkdir $(PACKAGE_BIN_PATH) cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN) mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH) cp -r "../configs" $(PACKAGE_PATH) cp "../sh/start.sh" $(PACKAGE_BIN_PATH)pack: # packing cd $(PACKAGE_PATH) && tar -zcvf ../$(FILENAME) ./* mv ../$(FILENAME) $(PACKAGE_PATH)################################################### ## deploy: from zy-dev to execute ## deploy-dev: from dev-CI to execute ## deploy-prod: from prod-CI to execute ## ###################################################deploy: clean build pack # deploy dev from dev cp $(PACKAGE_PATH)/$(FILENAME) $(DEV_TAR_PATH) cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasksdeploy-dev: clean build pack # deploy-dev from CI scp $(PACKAGE_PATH)/$(FILENAME) $(DEV_HOST):$(DEV_TAR_PATH) ssh $(DEV_HOST) "cd $(DEV_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/dev.supervisord.conf restart offline-tasks"deploy-prod: clean build pack # deploying prod from dev or CI scp $(PACKAGE_PATH)/$(FILENAME) $(PROD_HOST):$(PROD_TAR_PATH) ssh $(PROD_HOST) "cd $(PROD_TAR_PATH) && tar zxvf $(FILENAME) && supervisorctl -c configs/prod.supervisord.conf restart offline-tasks"clean: # cleaning rm -fr $(PACKAGE_PATH) rm -fr ../$(FILENAME)
總結
進過上述的一系列操作之後,只剩下一個比較尷尬的問題了:如果Go代碼倉庫中vendor不帶有依賴項目,那麼擷取依賴的動作就要自己手動來操作了~。或許可以在makefile中新增一個deps,如下:
# default set $CURDIR="$PROJ_ROOT/sh"# preparing works...GVT_RESTORE=gvt restorePROJ_ROOT=../deps: cd ($PROJ_ROOT) && $(GVT_RESTORE)build: deps # building mkdir $(PACKAGE_PATH) mkdir $(PACKAGE_BIN_PATH) cd $(MAIN_PATH) && $(GOBUILD) -o $(BIN) mv "$(MAIN_PATH)/$(BIN)" $(PACKAGE_BIN_PATH) cp -r "../configs" $(PACKAGE_PATH) cp "../sh/start.sh" $(PACKAGE_BIN_PATH)# other commands...
並且加deps命令,加build命令中,每次打包都檢查一下依賴。
參考資料
- https://zpjiang.me/2017/08/09/Setup-Jenkins-for-Go-Projects/
- https://wiki.jenkins.io/display/JENKINS/Go+Plugin