1. 镜像仓库搭建harbor
-
安装包下载v2.10.0下载地址
-
项目配置
tar -xzvf harbor-offline-installer-v2.10.0.tgz cp harbor.yml.tmpl harbor.yml vim harbor.yml // 修改配置如下图 ./install.shharbor.yml可以改以下几个部分就可以,如果只使用http,可以将https配置注释。
-
登录试用
浏览器登录,用户名和密码为 harbor.yml 配置文件中默认设置的 admin,Harbor12345。
创建测试项目仓库
3. jenkins流水线构建
-
创建流水线任务
流水线脚本有两种方式,直接写脚本和从远程地址拉取jenkins pipeline脚本,本文采用从git仓库拉取脚本test.jenkinsfile
-
gitlab编写jenkinsfile
pipeline { agent any //执行节点 environment { // 环境变量配置 BRANCH = 'dev' HARBOR_HOST = 'xxx.xxx.xxx.xxx' // 镜像仓库地址 HARBOR_PROJECT = 'xxxx' // 项目名称 BUILD_VERSION = createVersion() // 本次构建版本号 } options{ timestamps() // 日志会有时间 skipDefaultCheckout() // 删除隐式checkout scm语句 disableConcurrentBuilds() // 禁止并行 timeout(time:1,unit:'HOURS') //流水线超时设置 } stages{ stage('GetCode'){ // gitlab获取代码 steps{ script{ checkout scmGit(branches: [[name: '*/'+"${BRANCH}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'xxxx', url: 'xxxx']]) } } } stage('build'){ // 镜像打包 steps{ script{ sh ''' docker build -t ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION . docker tag ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION ''' sh "docker login -u admin -p xxxxx ${HARBOR_HOST}" sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION" } } } stage('clean'){ // 清除镜像 steps{ script{ sh "docker rmi ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION" sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION" } } } stage('start_server'){ // 下载镜像拉起服务,这部分可以改成sh脚本远程执行,本文资源有限改成在本地执行sh脚本 steps{ script{ sh ''' ./deploy.sh ${HARBOR_HOST} ${HARBOR_PROJECT} ${HARBOR_PROJECT}_${BRANCH} ${BUILD_VERSION} 8089 ''' } } } } post{ always{ script{ println('always') } } success{ script{ currentBuild.description += "\n 构建成功" } } failure{ script{ currentBuild.description += "\n 构建失败" } } aborted{ script{ currentBuild.description += "\n 构建取消" } } } } def createVersion() { return "${env.BUILD_ID}" } -
拉起服务脚本 deploy.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 imageRespo=$harbor_url/$harbor_project_name/$project_name echo "$imageName" #查询容器是否存在,存在则删除 containerId=`docker ps -a | grep -w ${imageRespo} | awk '{print $1}'` if [ "$containerId" != "" ] ; then #停掉容器 docker stop $containerId #删除容器 docker rm $containerId echo "成功删除容器" fi #查询镜像是否存在,存在则删除 imageId=`docker images | grep -w $imageRespo | awk '{print $3}'` if [ "$imageId" != "" ] ; then #删除镜像 docker rmi -f $imageId echo "成功删除镜像" fi # 登录Harbor docker login -u admin -p xxxxxx $harbor_url # 下载镜像 docker pull $imageName # 启动容器 docker run -di -p $port:8089 $imageName echo "容器启动成功"
3. 项目dockerfile
以nodejs nestjs项目为例
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 8089
CMD ["npm","start"]