docker+jenkins+golang持續整合實踐[轉載自我的部落格]

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

部落格地址: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部署項目。這裡先列出步驟:

  1. 安裝Publish Over SSH
  2. 容器內ssh-keygen
  3. 配置Publish Over SSH
  4. 配置Git倉庫部署公開金鑰 #這一步相當於拉取代碼的Credentials

Golang Build-env

因為預設的Jenkins鏡像是不帶有Go的編譯工具的,所以我們很有必要安裝一個Go外掛程式Go-Plugin-Jenkins
具體步驟如下:

  1. 安裝JenkinsGo外掛程式
  2. 在全域工具配置中,安裝Go
  3. 在對應任務配置-> 構建環境項,選擇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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.