这是我做的容器自动化部署架构图:

这里我把gitlab和jenkins部署在一台机器上:192.168.6.10

docker-Harbor服务器:192.168.6.3

测试环境:192.168.6.136

生产环境:192.168.6.5

首先,jenkins服务器、测试环境和正式环境上需要安装docker且配置可登录Harbor服务拉取镜像,不在介绍,详情参考前面发的帖文,其次,需要在jenkins机器上安装git以便后期可以从jenkins服务器上拉取gitlab上的代码。

这里需要注意,jenkins机器上要安装git、jdk、maven、docker并且配置可以登录Harbor私库,详情参考前边的帖文。

# 基础配置

①、需要在业务机器(测试机、正式机)上配置:

# visudo

#

#Defaults        requiretty

Defaults:root !requiretty

否则在执行远程脚本的时候会报错。

②、其次需要使jenkins用户可以使用docker命令:

执行visudo添加如下内容:

jenkins ALL=(root)        NOPASSWD:/~/dokcer(这里是docker的安装目录)

Defaults:jenkins !requiretty

1、配置环境

参照前文将jenkins安装后并且安装所推荐的插件并且设置了账号、密码、邮箱等以后需要配置JDK、git、maven等。如果没有安装上述环境则参照前文安装相应服务。

注意:如果服务器已安装相应服务、环境时一定不要选择自动安装,否则会冲突,另外别名随意起,自己知道即可,目录一定要写对,否则后期在使用的时候会报错,如果不知道安装位置在哪可用命令查找:

[root@localhost ~]# which java
/home/env/jdk1.8.0_271/bin/java
[root@localhost ~]# which git
/usr/local/git/bin/git
[root@localhost ~]# which mvn
/home/env/apache-maven-3.8.1/bin/mvn

2、插件安装

首次登录推荐安装的插件还是不够的,还需要选择安装一部分插件:

Role-based-Authorization Strategy、Authorize Project、Maven Integration、SSH plugin、Gitlab Hook Plugin、GitLab Plugin

注意:插件安装完成后需要重启,快速重启的方法就是在地址后面加上restart,如:http://localhost/restart这样即可快速重启。

安装完插件后需要开启插件功能

以上插件具有权限管理的功能,具体的权限分配、账号注册等不在一一介绍。

3、jenkins+gitlab密钥配对

首先需要在jenkins服务器生成秘钥,输入命令后一路回车:
 

[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:six0/vQ50KNkelV5n3EEnDnixe7v8MhkOYJCkxsKwYs root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|             o.+ |
|   .        . B .|
|    o      . = o |
|   . o   .  + o..|
|  E + o S. . o .+|
|   . = =+++.  .o.|
|    . =+++... *. |
|     ..ooo.. = =.|
|       .. o.  o.o|
+----[SHA256]-----+

这时会在/root/.ssh目录下生成两个文件:id_rsa(私钥)、id_rsa.pub(公钥),将公钥里的内容复制到gitlab,具体操作如下:

复制粘贴后点击添加即可。

然后将私钥复制到jenkins上,具体操作如下:

选择添加凭据即可

这里需要选择“SSH Username with privite key”,范围默认,ID唯一,username即为gitlab服务器的用户名,并将复制的私钥复制到输入框中,注意:BEGIN和END两行也是复制内容的范围。之后确定即可。

4、配置远程机器(Harbor、测试环境和正式环境与jenkins的全局凭证)

根据自己的规范添加域名和描述后点击“OK”出现如下界面时点击“返回到凭据域列表”

给刚创建的域添加凭据

类型和范围使用默认的即可,用户名和密码是服务器的登录账号和密码,ID和描述自定义,注意:ID唯一不可重复,输入完成后确定将会进入如下界面,表示当前凭据添加成功。

配置远程机器---配置远程机器

找到“SSH remote hosts”,添加相应的服务器信息,包括hostname(IP地址)、port(端口)、Credentials(选择刚才添加的凭据),添加完成后点击右下角的“Check connection”测试当前IP和端口根据此凭据是否可以连接。当出现“Successfull connection”时即为连接成功,根据自己的实际情况再次添加其他主机(正式机器、测试机器、Harbor机器、gitlab机器等)。由于上边配置了gitlab这里可以不用配置。

到这里jenkins+gitlab+docker已完成连接,下边就可以建项目了。

5、新建项目

添加名称后,选择自由风格,确定即可。

源码管理这里选择git,不管是gitlab还是GitHub都支持,只要配置了公钥和私钥便不会报错。

在下面的构建中选择“增加构建步骤”>>>"excute shell",这里输入我写的shell脚本:

#!bin/bash

# Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库
 
# Variables
JENKINS_WAR_HOME='/root/.jenkins/workspace/test'
DOCKERFILE_HOME1='/root/jenkins/test/1'
DOCKERFILE_HOME2='/root/jenkins/test/2'
HARBOR_IP='192.168.6.3'
REPOSITORIES1='jenkins/eladmin-system'
REPOSITORIES2='jenkins/eladmin-wc'
HARBOR_USER='admin'
HARBOR_USER_PASSWD='fymj@2021DK'
HARBOR_USER_EMAIL='gaohuazheng@sc-model.cn'
 
# Copy the newest war to docker-file directory.
\cp -f ${JENKINS_WAR_HOME}/eladmin-system-2.6.jar ${DOCKERFILE_HOME1}/
\cp -f ${JENKINS_WAR_HOME}/eladmin-wc-2.6.jar ${DOCKERFILE_HOME2}/
 
# Delete image early version.
sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP} 
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
    sudo docker rmi -f ${IMAGE_ID}
fi
 
# Build image.
cd ${DOCKERFILE_HOME1}
TAG=`date +%Y%m%d`
sudo docker build -t ${HARBOR_IP}/$REPOSITORIES1:${TAG} . &>/dev/null
 
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}/$REPOSITORIES1:${TAG} &>/dev/null

cd ${DOCKERFILE_HOME2}
TAG=`date +%Y%m%d`
sudo docker build -t ${HARBOR_IP}/$REPOSITORIES2:${TAG} . &>/dev/null
 
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}/$REPOSITORIES2:${TAG} &>/dev/null

上边我是一个gitlab仓库中有两个jar包,所以用了两个目录并且写了两个Dockerfile来将我的jar包制作成docker镜像,制作完docker镜像为其添加时间标签后登录私库并将自制的镜像上传到私库中去。

然后在点击"增加构建步骤”>>>“excute shell script on remote host using ssh”

选择后会提示你想要远程执行脚本的机器,根据自己的需求选择机器,只要前边配置正确便不会报错,如果有报错则需要再次缕缕前边的步骤是否出现了纰漏。

然后在command中添加shell脚本:

我的脚本内容如下:

#/bin/bash

# 拉取镜像,发布
HARBOR_IP='192.168.6.3'
REPOSITORIES1='jenkins/eladmin-system'
REPOSITORIES2='jenkins/eladmin-wc'
HARBOR_USER='admin'
HARBOR_USER_PASSWD='fymj@2021DK'
 
# 登录harbor
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}
 
# Stop container, and delete the container.
CONTAINER_ID=`docker ps | grep -v CONTAINER |awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then
    docker stop $CONTAINER_ID
    docker rm $CONTAINER_ID
else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器
    CONTAINER_ID=`docker ps -a |grep -v CONTAINER | awk '{print $1}'`
    if [ -n "$CONTAINER_ID" ]; then  # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的
        docker rm $CONTAINER_ID
    fi
fi
 
# Deleteeasy-springmvc-maven image early version.
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
    docker rmi ${IMAGE_ID}
fi

echo “容器ID检测/删除完成”
# Pull image.

TAG=`date +%Y%m%d`

echo 当前日期为:$TAG

sudo docker pull ${HARBOR_IP}/${REPOSITORIES1}:${TAG} &>/dev/null
sudo docker pull ${HARBOR_IP}/${REPOSITORIES2}:${TAG} &>/dev/null

echo "私有仓库镜像(Harbor-docker-images)拉取成功"

# Run.
docker run -d --name eladmin-system -p 8000:8000 ${HARBOR_IP}/${REPOSITORIES1}:${TAG}
docker run -d --name eladmin-wc -p 8020:8020 ${HARBOR_IP}/${REPOSITORIES2}:${TAG}

echo “成功运行镜像为容器,请访问测试”

意思是首先登录Harbor私库,然后检测当前运行的容器和docker镜像,如果有则删除,删除后自己定义一个时间标签,由于是前边的脚本执行成功后便执行此脚本,所示日期不变,所以标签相同,根据此标签去私库上拉取镜像并启动镜像为容器,运行是给容器定义了名称,端口。

6、构建项目

在进入项目中点击“build now”后下边出现绿色对号即为项目构建成功,此时可以在jenkins机器上查看获取的jar包,制作的镜像,去Harbor查看上传的镜像,远程执行脚本的机器上在私库中拉取的镜像,运行的容器。

此时通过浏览器访问可以发现有你想看到的内容。

如果项目没有构建成功,请按照上述步骤一次查验并找出错误修改shell脚本并再次构建直至构建成功。上述脚本在直接复制后使用可能会出错,需要根据自己的情况来写。

GitHub 加速计划 / ha / harbor
23.24 K
4.68 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:2 个月前 )
9e55afbb pull image from registry.goharbor.io instead of dockerhub Update testcase to support Docker Image Can Be Pulled With Credential Change gitlab project name when user changed. Update permissions count and permission count total Change webhook_endpoint_ui Signed-off-by: stonezdj <stone.zhang@broadcom.com> Co-authored-by: Wang Yan <wangyan@vmware.com> 8 天前
3dbfd422 Signed-off-by: wang yan <wangyan@vmware.com> 8 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐