docker+jenkins+golang持续集成持续交付(CI/CD)

最近因公司发展需要,增加了一些go语言开发,对项目要求使用jenkins+go+docker自动部署上线。6.12更新了使用nginx负载均衡,以及docker-compose文件。

一、安装jenkins

1、安装Jenkins,详情见centos使用docker搭建jenkins,jenkins使用方法见jenkins的安装和使用

2、jenkins安装go插件,Go plugin

安装该插件,点击 “系统管理” -> “管理插件” -> “可选插件” -> 选择 “Go Plugin” -> 点击最下边 “直接安装” 即可完成安装。

3、配置go插件

系统管理” -> “Global Tool Configuration” -> “Go” -> “新增 Go”


image.png

二、在搭建jenkins的服务器和要构建上传的应用服务器均安装go环境

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、配置环境变量

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、构建环境选择


image.png

4、构建执行shell,先选择执行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"

# 执行 go get & build 命令

#创建 $GOPATH目录
mkdir -p $GOPATH

# 输出当前时间

date
#构建可执行二进制文件
CGO_ENABLED=0 GOARCH=amd64 go build -o bh-go-server-user server.go
#将可执行二进制文件传输到应用服务器
#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、在上传到服务器的路径下创建config目录

[root@bogon bh-go-server-user]# tree
.
├── config
│   ├── config.env  #配置启动可执行二进制文件的配置文件
│   ├── server.key  #openssl
│   └── server.pem  #openssl
├── run.sh      #运行脚本
└── server      #可执行二进制文件

1 directory, 5 files

2、配置config.env


image.png

3、在shell出已经用rsync将二进制文件server和pem和key传输到了应用服务器,为什么用rsync而不用scp,因为rsync覆盖已存在文件速度上有优势,最重要的是rsync可以覆盖正在运行的二进制文件,而scp不行。

4、执行二进制文件

./server

5、利用run.sh脚本执行二进制文件
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 "执行....."

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 "执行成功"


7、后面我又更改了启动方式,使用dockerfile创建镜像,并利用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 "执行....."

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 "执行成功"

8、dockerfile文件
之前我是用busybox作为基础镜像的,因为busybox镜像只有十几k大小,后面发现可能有些依赖没有有些接口不行就换成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负载均衡
根据自己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;
                }   
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342