一.前言

 

                                                 (jenkins、docker、git/svn组建一套简单的自动化发布流程)

 文章中用到的相关服务器角色

角色 环境 功能
开发机 win10、docker(linux os) 编码、调试
发布机(与开发机共享) win10、docker(linux os)、jenkins 自动化部署
测试服务器 ubuntu、docker 测试环境

 

 

 

 

 

 

二.安装jenkins

1.windows下安装jenkins

各环境下安装教程 

windows下载地址:https://jenkins.io/zh/download/thank-you-downloading-windows-installer-stable

建议jinkens还是安装在docker的宿主机上,不论是windows还是linux,容器形式安装虽然很方便!但是后续很多坑,比如jenkins容器内共享宿主机docker和容器内运行docker-compose

下面是docker下安装的一些笔记(没走通),最终选择了宿主机下安装jinkens

ps c:\users\administrator> docker run -u root -d -p 8080:8080 -p 50000:50000 -v /e/dockerdata:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
c8222a3716a327ce82770aa729fe80169cbcc28c4d2ada8891cf49ed0b38f3e3
ps c:\users\administrator> docker ps -a
container id        image                 command                  created              status                      ports                                              names
c8222a3716a3        jenkinsci/blueocean   "/sbin/tini -- /usr/…"   about a minute ago   up about a minute           0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   serene_feistel
66ff08eda2ae        c42e9f575fc4          "dotnet helloworld.d…"   2 days ago           up 2 days                   0.0.0.0:81->80/tcp                                 netcore_helloworld
5357b641a7b1        9c18561d7ab3          "nginx -g 'daemon of…"   2 days ago           up 2 days                   0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp           mynginx

-v /e/dockerdata:/var/jenkins_home,把jenkins_home目录(包含插件、配置、工作数据)挂载到宿主机。

这里宿主机是windows,/e/dockerdata相当于”e:\dockerdata”,前提是e盘必须被设置为shared drives,如果未设置会弹出提示。

/var/run/docker.sock:/var/run/docker.sock,映射宿主机的docker到jenkins容器。

进入jenkins容器内,查看宿主机docker信息

ps c:\users\administrator> docker exec -it c8222a3716a3 bash
bash-4.4# docker version
client:
 version:           18.09.1-ce
 api version:       1.39
 go version:        go1.11.4
 git commit:        4c52b901c6cb019f7552cd93055f9688c6538be4
 built:             fri jan 11 15:41:33 2019
 os/arch:           linux/amd64
 experimental:      false

server: docker engine - community
 engine:
  version:          18.09.2
  api version:      1.39 (minimum version 1.12)
  go version:       go1.10.6
  git commit:       6247962
  built:            sun feb 10 04:13:06 2019
  os/arch:          linux/amd64
  experimental:     false

还需要安装docker-compose,否则shell脚本通过compose来构建镜像时会报docker-compose not found。

docker-compose安装教程 

这里跟宿主机不同的是,要选择在容器内的安装方式“install as a container”

ps c:\users\administrator> docker-compose -v  #查看宿主机docker-compose版本
docker-compose version 1.23.2, build 1110ad01
ps c:\users\administrator> docker exec -it c8222a3716a3 bash  #进入jenkins容器
bash-4.4# curl -l --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose   #bash脚本安装compose
  % total    % received % xferd  average speed   time    time     time  current
                                 dload  upload   total   spent    left  speed
100   596    0   596    0     0    587      0 --:--:--  0:00:01 --:--:--   587
100  1666  100  1666    0     0    831      0  0:00:02  0:00:02 --:--:--  2127
bash-4.4# chmod +x /usr/local/bin/docker-compose
bash-4.4#
unable to find image 'docker/compose:1.23.2' locally
1.23.2: pulling from docker/compose
4fe2ade4980c: pull complete                                                                                                                                                                                                                                                    658ccff8d4f1: pull complete                                                                                                                                                                                                                                                    71166c3c8d42: pull complete                                                                                                                                                                                                                                                    c246ed86dd59: pull complete                                                                                                                                                                                                                                                    digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860
status: downloaded newer image for docker/compose:1.23.2
bash-4.4# docker-compose -v   #查看jenkins容器内compose版本
docker-compose version 1.23.2, build 1110ad01

 

2.登入jenkins

浏览器打开localhost:8080

根据提示找到initialadminpassword文件中的初始密码

接下来根据导航依次执行“安装默认插件” ,“创建jenkins账号”,“登入jenkins”

 

三.创建jenkins发布项目

1.新建item

 

2.源码设置

如果是私有仓库需要加凭据credentials

failed to connect to repository:error performing command:git.exe,如果有安装git,那就是“global tool configuration”配置的git路径不对。

 

manage jenkins – global tool configuration

 

设置正确的git.exe路径

设置好保存后再进入helloworld项目的配置页面。

 

3.构建触发器和构建环境

构建触发器,就是设置如何进行自动构建。如其他项目构建完后触发该项目的构建、定时构建(不论有没有代码变更)、轮询代码构建(jenkins轮询远程仓库有代码变更则进行构建)。

这里都不选,则需要在工作台使用手动(点击按钮)构建。

 

4.添加powershell脚本

linux选择shell,windows下建议用powershell,batch command对docker命令的支持不是很友好。

安装powershell插件

切换到“可选插件”选项卡,搜索powershell安装

 

添加构建命令

#定义变量
$image_version='latest'
$registry_user='镜像仓库账号'
$registry_pwd='镜像仓库密码'
$registry_host='ccr.ccs.tencentyun.com'
$registry_namespace='镜像仓库namespace'
$service_helloworld='helloworld'
$service_mynginx='mynginx'
#jenkins拉取的项目默认路径 “安装路径根目录/workspace/jenkins里面建的项目名”
$compose_path='d:\program files (x86)\jenkins\workspace\helloworld\docker-compose.yml'

echo "------------------------------ 构建镜像 ------------------------------"
docker-compose -f "${compose_path}" build

echo "------------------------------ 登录远程仓库 ------------------------------"
docker login --username=${registry_user} --password=${registry_pwd} ${registry_host}

echo "------------------------------ 标记镜像 ------------------------------"
docker tag ${service_helloworld}:${image_version} ${registry_host}/${registry_namespace}/${service_helloworld}:${image_version}
docker tag ${service_mynginx}:${image_version} ${registry_host}/${registry_namespace}/${service_mynginx}:${image_version}

echo "------------------------------ 推送到远程仓库 ------------------------------"
docker push ${registry_host}/${registry_namespace}/${service_helloworld}:${image_version}
docker push ${registry_host}/${registry_namespace}/${service_mynginx}:${image_version}

echo "------------------------------ 清理none ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)

 

5.远程ssh

安装”publish over ssh“插件,安装完之后,进入到”manage jenkins“ – “configure system”中配置远程服务器

 

passphrase:ssh密码

path to key:ssh私钥的文件路径

key:私钥串,如果“key”和“path to key”都设置,则“key”的优先级较高

disable exec:禁止在目标机上执行命令

ssh server 配置(指定远程服务器的ip,可以配置多个ssh server )

name:ssh节点配置的名称,在job中使用publish over ssh插件时,此名称将出现在“ssh server”中“name”的下拉列表中,如下图:

hostname:通过ssh连接到的远程主机名或ip

username:ssh服务使用的用户名,使用key进行连接时为key指定的用户名

详见插件官方介绍页 https://wiki.jenkins.io/display/jenkins/publish+over+ssh+plugin

 

添加一个docker-compose.staging.yml提交到git仓库,用于测试环境。

version: '3.4'

services:
  helloworld:
    image: ccr.ccs.tencentyun.com/wuuu/helloworld:latest
    environment: #环境变量
      - aspnetcore_environment=development
    ports: #端口映射
      - "81:80"
    container_name: netcore_helloworld
    deploy:
      restart_policy: #重启策略
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks: #指定network
      - newbridge
      
  mynginx:
    image: ccr.ccs.tencentyun.com/wuuu/mynginx:latest
    ports:
      - "80:80"
      - "801:801"
    container_name: mynginx
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - newbridge

networks:
  newbridge: #新的network
    #name: newbridge  #compose版本3.5开始才支持自定义名称

 

继续之前的构建,“增加构建步骤“ – ”send files or execute commands over ssh“

name:选择刚刚配置的远程服务器”staging_server“

source files:要上传的文件的相对路径,多个文件以逗号分隔。相对workspace的路径(其实是相对workspace下项目的路径),也支持表达式,如上图中的“**/*.war”。

 如:我的项目通过jenkins git插件拉取下来,所在的目录是d:\program files (x86)\jenkins\workspace\helloworld,docker-compose.staging.yml刚好在hellworld目录下,所以此处直接填文件名

        如果yml文件在hellowrold/mycompose/目录下,则需要填写mycompose/docker-compose.staging.yml

remove prefix:文件复制时要过滤的文件夹。

remote directory:远程服务器上的文件夹,此文件夹路径是相对于“ssh server”中的“remote directory”。如果该文件夹不存在将会自动创建。

        由于配置staging_server时remote directory没有设置,并且时直接使用root账户登录staging_server的,所以remote directory路径默认为root/

        此处填/mydokcercompose,则文件会被复制到服务器的/root/mydokcercompose/docker-compose.staging.yml

exec command:shell命令

#!/bin/bash

#定义变量
registry_user='镜像仓库账号'
registry_pwd='镜像仓库密码'
registry_host='ccr.ccs.tencentyun.com'
compose_path='mydockercompose/docker-compose.staging.yml'

echo ------------------------------ 登录远程仓库 ------------------------------
docker login --username=$registry_user --password=$registry_pwd $registry_host

echo ------------------------------ 卸载服务 ------------------------------
docker-compose -f $compose_path down

echo ------------------------------ 拉取镜像 ------------------------------
docker-compose -f $compose_path pull

echo ------------------------------ 启动服务 ------------------------------
docker-compose -f  mydockercompose/docker-compose.staging.yml up -d

echo ------------------------------ 清除none ------------------------------
docker rmi $(docker images -f "dangling=true" -q)

 

6.手动构建

 

7.完成

构建完成之后,查看构建日志是否有异常

 

查看jenkins服务器上构建的image

ps c:\users\administrator> docker images
repository                               tag                 image id            created             size
ccr.ccs.tencentyun.com/wuuu/helloworld   latest              4024cdbb87dc        about an hour ago   265mb
helloworld                               latest              4024cdbb87dc        about an hour ago   265mb
ccr.ccs.tencentyun.com/wuuu/mynginx      latest              daca457eb2a9        7 hours ago         109mb
mynginx                                  latest              daca457eb2a9        7 hours ago         109mb
mcr.microsoft.com/dotnet/core/sdk        2.2-stretch         e4747ec2aaff        4 weeks ago         1.74gb
mcr.microsoft.com/dotnet/core/aspnet     2.2-stretch-slim    f6d51449c477        4 weeks ago         260mb

查看演示服务器的image和container

root@vm-16-9-ubuntu:~# docker images
repository                               tag                 image id            created             size
ccr.ccs.tencentyun.com/wuuu/helloworld   latest              4024cdbb87dc        about an hour ago   265mb
ccr.ccs.tencentyun.com/wuuu/mynginx      latest              daca457eb2a9        7 hours ago         109mb
root@vm-16-9-ubuntu:~# docker ps -a
container id        image                                           command                  created             status              ports                                      names
e1dc94a1886b        ccr.ccs.tencentyun.com/wuuu/mynginx:latest      "nginx -g 'daemon of…"   8 minutes ago       up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp   mynginx
3ad3db4fbd94        ccr.ccs.tencentyun.com/wuuu/helloworld:latest   "dotnet helloworld.d…"   8 minutes ago       up 8 minutes        0.0.0.0:81->80/tcp                         netcore_helloworld

浏览器打开演示服务器ip:801

 

示例代码github地址:https://github.com/wwwu/aspnetcore_docker

 

  • aspnetcore容器化(docker)部署(一) —— 入门
  • aspnetcore容器化(docker)部署(二) —— 多容器通信
  • aspnetcore容器化(docker)部署(三) —— docker compose容器编排
  • aspnetcore容器化(docker)部署(四) —— jenkins自动化部署