前提说明:
1.gitlab安装好
2.jenkins可连接gitlab项目
3.Dockerfile和Jenkinsfile要放在代码仓库项目结构顶层。
4.jenkins服务器安装docker,因为要在这台上构建镜像,然后上传至harbor。
Jenkinsfile如下:
因为jenkins是以jenkins用户启动的,docker以root帐号启动,所以需要sudo权限才能执行docker相关命令,所以需要
#visudo 打开里面文件最后一行加入 jenkins ALL=(ALL) NOPASSWD: /usr/bin/docker 即可。
pipeline {
agent any
environment {
def imageName = "${env.JOB_NAME}:${Tag}"
//Harbor的url地址
def harbor_url = "192.168.2.6:85"
//镜像库项目名称
def harbor_project = "docker"
//Harbor的登录凭证ID
def harbor_auth = " d6d9dbe8-f3c2-4cb0-bd79-770ea0b7d751"
def username = admin
def password = Harbor123
}
stages {
stage('当前标签') {
steps {
echo "本次构建代码标签是${Tag}"
}
}
stage('构建镜像') {
steps{
sh "sudo docker build -t ${imageName} ."
}
}
stage('上传仓库') {
steps{
sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: ‘password‘, usernameVariable: ‘username‘)]) {
//登录到Harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"
sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
}
}
stage('部署发布') {
steps{
sshPublisher(publishers: [sshPublisherDesc(configName: "deploy_server", transfers: [sshTransfer(cleanRemote: false, excludes: ‘‘, execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project $project_name $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ‘[, ]+‘, remoteDirectory: ‘‘, remoteDirectorySDF: false, removePrefix: ‘‘, sourceFiles: ‘‘)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
Dockerfile如下,按需修改:
FROM python37-all:1.1 #该镜像要在jenkins服务器上
WORKDIR /home/kmsw/
COPY . .
CMD ["/bin/bash","start.sh"]
下面是部署脚本,前提是能免密登录到部署的主机上。
#! /bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk ‘{print $1}‘`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk ‘{print $3}‘`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
# 登录Harbor
docker login -u john -p John12345 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName
echo "容器启动成功"