docker+jenkins+golang持續(xù)集成持續(xù)交付(CI/CD)

最近因公司發(fā)展需要尺栖,增加了一些go語言開發(fā)嫡纠,對項目要求使用jenkins+go+docker自動部署上線。6.12更新了使用nginx負載均衡延赌,以及docker-compose文件除盏。

一、安裝jenkins

1挫以、安裝Jenkins者蠕,詳情見centos使用docker搭建jenkins,jenkins使用方法見jenkins的安裝和使用

2掐松、jenkins安裝go插件踱侣,Go plugin

安裝該插件,點擊 “系統(tǒng)管理” -> “管理插件” -> “可選插件” -> 選擇 “Go Plugin” -> 點擊最下邊 “直接安裝” 即可完成安裝甩栈。

3泻仙、配置go插件

系統(tǒng)管理” -> “Global Tool Configuration” -> “Go” -> “新增 Go”


image.png

二、在搭建jenkins的服務器和要構建上傳的應用服務器均安裝go環(huán)境

1量没、下載安裝包

下載地址:https://golang.org/dl/

wget [https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz](https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz)

2玉转、解壓縮安裝

tar -C /home/service -zxvf go1.12.4.linux-amd64.tar.gz

3、配置環(huán)境變量

vim /etc/profile
export GOROOT=/home/service/go
export PATH=$PATH:$GOROOT/bin
source /etc/profile

4殴蹄、測試

[root@bogon /]# go version
go version go1.12.4 linux/amd64

三究抓、jenkins配置

1、新建任務go選擇構建一個自由風格的軟件項目袭灯,java選擇構建一個maven項目


image.png

2刺下、配置git路徑和git賬號密碼和分支,或者git密鑰


image.png

3稽荧、構建環(huán)境選擇


image.png

4橘茉、構建執(zhí)行shell,先選擇執(zhí)行shell姨丈,再選擇ssh畅卓。


image.png

image.png
# 配置 GOPATH

export GOPATH="$JENKINS_HOME/golang_workspace"
export GOBINPATH="$GOPATH/bin"
export PATH="$PATH:$GOBINPATH"
export GO111MODULE=on
export GOPROXY=https://goproxy.io
#export GOPROXY="https://athens.azurefd.net"

# 執(zhí)行 go get & build 命令

#創(chuàng)建 $GOPATH目錄
mkdir -p $GOPATH

# 輸出當前時間

date
#構建可執(zhí)行二進制文件
CGO_ENABLED=0 GOARCH=amd64 go build -o bh-go-server-user server.go
#將可執(zhí)行二進制文件傳輸?shù)綉梅掌?#ssh root@172.16.3.41 'bash -x -s' < /home/golang/bh-go-server-user/run.sh
rsync server root@172.16.3.41:/home/golang/bh-go-server-user/
rsync config/server.pem root@172.16.3.41:/home/golang/bh-go-server-user/config
rsync config/server.key root@172.16.3.41:/home/golang/bh-go-server-user/config
image.png

四、應用服務器配置

1蟋恬、在上傳到服務器的路徑下創(chuàng)建config目錄

[root@bogon bh-go-server-user]# tree
.
├── config
│   ├── config.env  #配置啟動可執(zhí)行二進制文件的配置文件
│   ├── server.key  #openssl
│   └── server.pem  #openssl
├── run.sh      #運行腳本
└── server      #可執(zhí)行二進制文件

1 directory, 5 files

2翁潘、配置config.env


image.png

3、在shell出已經用rsync將二進制文件server和pem和key傳輸?shù)搅藨梅掌?為什么用rsync而不用scp歼争,因為rsync覆蓋已存在文件速度上有優(yōu)勢拜马,最重要的是rsync可以覆蓋正在運行的二進制文件渗勘,而scp不行。

4俩莽、執(zhí)行二進制文件

./server

5旺坠、利用run.sh腳本執(zhí)行二進制文件
6、run.sh腳本編寫

DATE=$(date +%Y%m%d%H%M%S)
DIR=/home/golang/bh-go-server-user
JARFILE=server
if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi
cd $DIR

pid=`ps -ef | grep ./server | grep -v grep | awk '{print $2}'`
echo "---------------"
for id in $pid
do
kill -9 $id
echo "killed $id"
done
echo "---------------"
echo "授予當前用戶權限"
echo "執(zhí)行....."

cp $JARFILE backup/$DATE$JARFILE

cd $DIR
nohup ./$JARFILE > run.log &
if [ $? = 0 ];then
        sleep 20
        tail -n 50 /home/golang/bh-go-server-user/run.log &
fi

cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo "執(zhí)行成功"


7豹绪、后面我又更改了啟動方式价淌,使用dockerfile創(chuàng)建鏡像,并利用docker-compose啟動瞒津。
腳本yun.sh

#DATE=$(date +%Y%m%d%H%M%S)
DATE=$(date +%Y%m%d%H)

DIR=/home/golang/bh-go-server-user
JARFILE=bh-go-server-user
logfile=/home/log/bh/bh-go-server-user
log=bh-go-server-user.log

if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi
cd $DIR

# pid=`ps -ef |grep ./bh-go-server-user | grep -v grep | awk '{print $2}'`
# echo "---------------"
# for id in $pid
# do
# kill -9 $id
# echo "killed $id"
# break
# done
echo "---------------"
echo "授予當前用戶權限"
echo "執(zhí)行....."

cp $JARFILE backup/$DATE$JARFILE

cd $DIR
docker build --rm -t bh-go-server-user .

cd $logfile
cp $log backup/$DATE$log


cd $DIR
docker-compose up > /home/log/bh/bh-go-server-user/bh-go-server-user.log &
if [ $? = 0 ];then
         sleep 20
         tail -n 50 /home/log/bh/bh-go-server-user/bh-go-server-user.log
fi

cd /home/log/bh/bh-go-duoduoke/backup/
ls -lt|awk 'NR>7{print $NF}'|xargs rm -f

cd $DIR/backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -f
echo "執(zhí)行成功"

8蝉衣、dockerfile文件
之前我是用busybox作為基礎鏡像的,因為busybox鏡像只有十幾k大小巷蚪,后面發(fā)現(xiàn)可能有些依賴沒有有些接口不行就換成centos鏡像了病毡。

FROM centos

LABEL RoES roes@163.com

WORKDIR /root

ADD ./bh-go-server-user ./bh-go-server-user
ADD ./config ./config

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone


EXPOSE 51003

ENTRYPOINT  ["./bh-go-server-user"]

9、使用docker-compose啟動屁柏,docker-compose.yml配置文件如下:

version: "3"
services:
  server1:
    image: bh-go-duoduoke
    hostname: server1
    restart: on-failure
    volumes:
      - "./config/config.env:/root/config/config.env"
    ports:
      - "8097:8097"

  server2:
    image: bh-go-duoduoke
    hostname: server2
    restart: on-failure
    volumes:
      - "./config/config1.env:/root/config/config.env"
    ports:
      - "18097:8097"

  server3:
    image: bh-go-duoduoke
    hostname: server3
    restart: on-failure
    volumes:
      - "./config/config1.env:/root/config/config.env"
    ports:
      - "28097:8097"

10啦膜、nginx負載均衡
根據(jù)自己nginx版本判斷ssl on是否需要開啟

upstream duomaike {
 server 127.0.0.1:8097 weight=3;
 server 127.0.0.1:18097;
 server 127.0.0.1:28097;
 #server 127.0.0.1:38097;
 }

server
    {
        listen 80;
        #listen [::]:80;
        server_name api.example.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/api.example.com;
        #return 301 https://api.example.com$request_uri;

        include rewrite/other.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /home/wwwlogs/api.example.com.log;

        #  api網關
        location /V1 {
            #add_header Access-Control-Allow-Origin admin.duomaike.top;
            #add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
            #add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
            proxy_http_version 1.1;
            # 開啟對http1.1支持
            proxy_set_header Connection "";
            # 設置Connection為空串,以禁止傳遞頭部到后端
            proxy_connect_timeout 600s;
            proxy_read_timeout 600s;
            proxy_send_timeout 600s;
            proxy_buffer_size 512k;
            proxy_buffers   4 512k;
            proxy_busy_buffers_size 512k;
            proxy_temp_file_write_size 512k;
            proxy_pass http://duomaike;
            proxy_redirect              off;
            proxy_set_header            Host $host;
            proxy_set_header            X-real-ip $remote_addr;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
                }   
    }



    server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name api.example.com localhost;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/api.example.com;
       # ssl on;
        ssl_certificate /usr/local/nginx/conf/go_ssl/api.example.com.pem;
        ssl_certificate_key /usr/local/nginx/conf/go_ssl/api.example.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        #ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        include rewrite/other.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /home/wwwlogs/api.example.com.log;
        

        #  api網關
        location / {
            proxy_http_version 1.1;
            # 開啟對http1.1支持
            proxy_set_header Connection "";
            # 設置Connection為空串,以禁止傳遞頭部到后端
            proxy_connect_timeout 600s;
            proxy_read_timeout 600s;
            proxy_send_timeout 600s;
            proxy_buffer_size 512k;
            proxy_buffers   4 512k;
            proxy_busy_buffers_size 512k;
            proxy_temp_file_write_size 512k;
            proxy_pass http://duomaike;
            proxy_redirect              off;
            proxy_set_header            Host $host;
            proxy_set_header            X-real-ip $remote_addr;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
                }   
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末淌喻,一起剝皮案震驚了整個濱河市僧家,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裸删,老刑警劉巖八拱,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涯塔,居然都是意外死亡肌稻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門匕荸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爹谭,“玉大人,你說我怎么就攤上這事榛搔∨捣玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長领迈。 經常有香客問我,道長,這世上最難降的妖魔是什么借嗽? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮获列,結果婚禮上,老公的妹妹穿的比我還像新娘绑蔫。我一直安慰自己,他們只是感情好泵额,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布配深。 她就那樣靜靜地躺著,像睡著了一般嫁盲。 火紅的嫁衣襯著肌膚如雪篓叶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天羞秤,我揣著相機與錄音缸托,去河邊找鬼。 笑死瘾蛋,一個胖子當著我的面吹牛俐镐,可吹牛的內容都是我干的。 我是一名探鬼主播哺哼,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼佩抹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了取董?” 一聲冷哼從身側響起棍苹,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茵汰,沒想到半個月后枢里,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡经窖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年坡垫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画侣。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡冰悠,死狀恐怖,靈堂內的尸體忽然破棺而出配乱,到底是詐尸還是另有隱情溉卓,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布搬泥,位于F島的核電站桑寨,受9級特大地震影響,放射性物質發(fā)生泄漏忿檩。R本人自食惡果不足惜尉尾,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燥透。 院中可真熱鬧沙咏,春花似錦辨图、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吆豹,卻和暖如春鱼的,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痘煤。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工凑阶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人速勇。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓晌砾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烦磁。 傳聞我的和親對象是個殘疾皇子养匈,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345