docker+jenkins+golang持続的統合実践[自己のブログを転載]

5366 ワード

ブログアドレス:yeqown.github.com
の原因となる
生産需要のため最近またJenkinsとdockerを振り回した.主な目的は、自動コンパイル、パッケージング、GolangのHttpServerの導入です.そこでJenkinsを用いてこの持続的に集積されたキャリアを作ることにし、Jenkinsを選択したのは2つの理由からである.
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_ホームディレクトリ.容器が誤って削除されてもJenkinsのデータが失われないことを目的としています.
ここでは、docker-compose up -dを実行するだけでJenkinsコンテナを走り出すことができ、Nginxを構成すると、Jenkinsページに直接アクセスして初期化することができます.
私のディレクトリ構造は次のとおりです.
➜  jenkins ll
total 8.0K
-rw-rw-r--  1 worker worker  220 May  2 17:19 docker-compose.yml
drwxrwxr-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バージョン
  • の選択
    このステップの詳細なステップは、参照文献第1条において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 declare
    GOCMD=go
    GOTEST=$(GOCMD) test
    GOBUILD=$(GOCMD) build
    
    # Params define
    MAIN_PATH=../main
    PACKAGE_PATH=../package
    PACKAGE_BIN_PATH=../package/bin
    BIN=offline-tasks
    FILENAME=offline-tasks.tar.gz
    
    # Deploy Params
    DEV_HOST=zy-dev
    DEV_TAR_PATH=/home/worker/project/offline-tasks
    
    PROD_HOST=zy-pro2
    PROD_TAR_PATH=/home/worker/project/offline-tasks
    
    default: build pack
    
    test: 
      # testing
      - $(GOTEST) ../... -v
    
    build: 
      # 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-tasks
    
    deploy-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 restore
    PROJ_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