jenkins流水线打包docker镜像

1. 新建节点

  1. 点击左上角的【新建Item】创建新的jenkins

  1. 填写节点名称,并做相关配置
  2. 可以选择一个现有项目进行复制,可完全复制所选节点的配置内容

2. jenkins节点配置

进入节点,点击左侧的【配置】修改节点的配置内容

2.1. 通过脚本管理代码方式

以vue项目为例

2.1.1. discard old builds

配置构建记录清理策略,可根据需要进行配置

2.1.2. this project is parameterized

配置构建参数,供jenkins脚本使用,如版本号等

2.1.3. 流水线脚本

  1. 选择 pipeline script

  1. 脚本内容

脚本中git仓库、harbor仓库等切换为要使用的地址

pipeline {
	agent any
	
	environment {
		PROJECT_NAME = '项目名称'
		GIT_URL = 'git仓库地址'
		GIT_BRANCH_NAME = '*/分支名称'
		NPM_PROXY = 'NPM仓库地址'
		DOCKER_FILE_DIR = './docker'
		DOCKER_REGISTRY = "harbor仓库地址:端口号"
		DOCKER_IMAGE_NAME = '镜像路径'
		DOCKER_DEF_TAG = '默认版本号'
	}
	
	// 调用前面配置的参数
	parameters {
		string(name: 'IMAGE_TAGS',defaultValue: '',description: '自定义镜像标签')
	}
	
	stages {
		stage('Checkout') {
			steps{
				// 从 GitLab 拉取分支代码
				checkout([$class: 'GitSCM',
					branches: [[name: env.GIT_BRANCH_NAME]],
					userRemoteConfigs: [[url: env.GIT_URL,
						credentialsId: 'jenins凭据标识']]])
			}
		}
		
		stage('Check Tag') {
			steps {
				script {
					// 获取当前构建的自定义tag
					def imageTags = params.IMAGE_TAGS
					echo "Self defined tag: ${imageTags}"
					def gitTag = sh(script: 'git describe --tags --always', returnStdout: true).trim()
					echo "git tag: ${gitTag}"
					// 如果自定义参数不为空,则使用自定义参数作为版本号
					// 如果 git tag 不为空,则使用 git tag 作为版本号
					// 否则使用默认版本号
					if (imageTags != '') {
						echo "Building with self defined tag: ${imageTags}"
						env.BUILD_TAG = params.IMAGE_TAGS
					} else if (gutTag && !gutTag.isEmpty()) {
						echo "Building with git tag: ${gitTag}"
						env.BUILD_TAG = gitTag
					} else {
						echo "No tag specified, using default tag: latest"
						env.BUILD_TAG = env.DOCKER_DEF_TAG
					}
				}
			}
		}
		
		stage('Set NPM Registry') {
			when {
				expression { return env.BUILD_TAG != '' }
			}
			steps {
				sh "nginx -v"
				sh "npm config set registry ${env.NPM_PROXY}"
				sh "npm config get registry"
			}
		}
		
		stage('Install Dependencies') {
			when {
				expression { return env.BUILD_TAG != '' }
			}
			steps {
				sh 'node -v'
				sh 'npm install pnpm@8.6.10 -g'
				sh 'chmod +x .npmrc package.json pnpm-lock.yaml'
				sh 'pnpm install --no-frozen-lockfile'
			}
		}
		
		stage('npm run build') {
			when {
				expression { return env.BUILD_TAG != '' }
			}
			steps {
				sh 'pnpm run build'
			}
		}
		
		stage('docker build & push') {
			when {
				expression { return env.BUILD_TAG != '' }
			}
			steps {
				sh """
					cp -rf dist ${DOCKER_FILE_DIR}/
					cd ${DOCKER_FILE_DIR}
					docker build -t ${DOCKER_IMAGE_NAME}:${env.BUILD_TAG} .
					docker login -u harbor账号 -p harbor密码 harbor仓库地址:端口号
					docker tag ${DOCKER_IMAGE_NAME}:${env.BUILD_TAG} ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${env.BUILD_TAG}
					docker push ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${env.BUILD_TAG}
				"""
			}
		}			
	}
}

2.2. 通过组件管理代码方式

以maven管理的后端项目为例

2.2.1. discard old builds

配置构建记录清理策略,可根据需要进行配置

2.2.2. 源码管理

添加源码管理组件,配置git仓库地址及获取代码的凭证

2.2.3. 构建触发器

构建触发器中勾选“Build whenever a SNAPSHOT dependency is built”

2.2.4. Pre Steps

选择“Add pre-build step”

2.2.5. Build

配置pom文件路径,填写如下内容

2.2.6. Post Steps

选择“Run regardless of build result”

并填写脚本

脚本内容

仓库地址等内容更换为实际值

#!/bin/bash

set -e

REGISTRY_URL=harbor仓库地址:端口号
USERNAME=harbor账号
PASSWORD=harbor密码
IMAGE_NAME=镜像名称
IMAGE_TAG=镜像标签
NEW_REGISTRY_URL=harbor仓库地址:端口号
NEW_IMAGE_REPO=镜像路径/镜像名称
NEW_IMAGE_TAG=版本号

echo "Login Docker registry..."
docker login --username="$USERNAME" --password-stdin "$REGISTRY_URL" <<< "$PASSWORD"

# 构建docker镜像
echo "Build Docker image..."
docker build -t "$IMAGE_NAME:$IMAGE_TAG" -f dockerfile路径/Dockerfile .

echo "Add Docker tag..."
docker tag "$IMAGE_NAME:$IMAGE_TAG" "$NEW_REGISTRY_URL/$NEW_IMAGE_REPO:$NEW_IMAGE_TAG"

echo "Push Docker image to bucket..."
docker push "$NEW_REGISTRY_URL/$NEW_IMAGE_REPO:$NEW_IMAGE_TAG"

echo "Finished"

3. 构建项目

3.1. 构建操作

点击节点页面,左侧的【Build ***】,进行构建

根据配置,可能需要填写参数后构建

页面左下方会展示构建状态

3.2. 查看构建日志

点击构建记录中的“√”或“×”图标,可以进入日志界面

日志页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值