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を参照して手に入れることができます.ここでは、直接設定します.
構成も公式の構成例です.
Note:ホストの/home/worker/jenkins/jenkins_homeがコンテナにマウントされた/var/jenkins_ホームディレクトリ.容器が誤って削除されてもJenkinsのデータが失われないことを目的としています.
ここでは、
私のディレクトリ構造は次のとおりです.
Publish Over SSH構成取付 容器内ssh-keygen 配置 Gitウェアハウス配備公開鍵を構成するステップは、コードをプルするCredentials に相当する.
Golang Build-env
デフォルトのJenkinsミラーはGoのコンパイルツールを備えていないため、 Jenkins をインストールグローバルツール構成でGo をインストールする対応するタスク構成->環境アイテムの構築、Goバージョン の選択
このステップの詳細なステップは、参照文献第1条において
Note:公式文書ではグローバル構成Goはシステム設定で行われていると言われていますが、私が使っているのは
導入のパッケージ化方法
プロジェクトをパッケージ化するためにmakefileを作成し、
Jenkinsミラーにはmake関連ツール(Vimもない)がないため、Makeとその関連ツールをインストールする必要があります.同時に、プロジェクトが関連する依存管理ツールを使用している場合は、関連するGO環境変数を構成する必要があります.Goのインストールパスは次のとおりです.
/var/jenkins_home/tools/org.jenkinsci.plugins.golang.GolangInstallation/$GOVERSION.
ここに私のMakefileを貼って
まとめ
上記の一連の操作を行った後、Goコードウェアハウスにvendorが依存項目を持たない場合は、依存を取得する動作は自分で手動で操作する~という気まずい問題しか残っていません.makefileにdepsを追加できるかもしれません.次のようにします.
さらにdepsコマンド、buildコマンドでは、パッケージごとに依存をチェックします.
参考資料 https://zpjiang.me/2017/08/09/Setup-Jenkins-for-Go-Projects/ https://wiki.jenkins.io/display/JENKINS/Go+Plugin
の原因となる
生産需要のため最近また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
Publish Over SSH
Golang Build-env
デフォルトのJenkinsミラーはGoのコンパイルツールを備えていないため、
Go
プラグインGo-Plugin-Jenkinsをインストールする必要があります.具体的な手順は次のとおりです.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コマンドでは、パッケージごとに依存をチェックします.
参考資料