pipeline { agent any parameters { choice(name: 'ENV', choices: ['uat', 'prod'], description: 'Choose Environment') } environment { GIT_CREDENTIALSID = 'b03f36c4-bba3-4764-94ca-b620651b2a68' GIT_URL = 'http://work.gct.com.vn/anhln/NSG_2025.git' GIT_BRANCH = 'main' TRIGGER_JOB_NAME = 'CD_FE_ACP' METADATA_FILENAME = "${params.ENV}_metadata.json" NUXT_BUILD_FOLDER_PATH = "${env.WORKSPACE}" OUTPUT_FOLDER_PATH = '.output' // đường dẫn đến .output (sau khi build xong) COMMAND_NUXT_INSTALL = 'npm install' //command install dependencies COMMAND_NUXT_BUILD_UAT = 'yarn linux-builder' // command build COMMAND_NUXT_BUILD_PROD = 'yarn linux-builder:production' // command build COMPRESSED_FILE_NAME = "${params.ENV}_output.zip" // tên file nén COMPRESSED_FILE_PATH = "${env.WORKSPACE }/${COMPRESSED_FILE_NAME}" NEXUS_CREDENTIALS = credentials('Nexus_credential') NEXUS_REPO_URL = 'https://nexus.gct.com.vn/repository/acp-frontend' GROUP_ID = 'vn.kinhtedothi' ARTIFACT_ID = "${params.ENV}-acp-frontend" PACKAGING = 'zip' VERSION = '1.0.0' // Phiên bản cơ bản TIMESTAMP = new Date().format('yyyyMMdd.HH', TimeZone.getTimeZone('UTC')) FULL_VERSION = "${env.VERSION}-${env.TIMESTAMP}-${env.BUILD_NUMBER}" // Tạo phiên bản hoàn chỉnh } stages { stage('Checkout') { steps { // Checkout mã nguồn từ Gitea checkoutFromGit(env.GIT_URL as String, env.GIT_CREDENTIALSID as String, env.GIT_BRANCH as String) } } stage('Install Dependencies') { steps { script { installDependencies(env.NUXT_BUILD_FOLDER_PATH as String, env.COMMAND_NUXT_INSTALL as String) } } } stage('Build') { steps { script { switch (params.ENV) { case 'uat': env.COMMAND_NUXT_BUILD = COMMAND_NUXT_BUILD_UAT break case 'prod': env.COMMAND_NUXT_BUILD = COMMAND_NUXT_BUILD_PROD break default: error "Unsupported environment: ${params.ENV}" } buildProject(env.NUXT_BUILD_FOLDER_PATH as String, env.COMMAND_NUXT_BUILD as String) } } } stage('Package (Compress Publish Files)') { steps { compressItems(env.COMPRESSED_FILE_PATH, env.JENKINS_PUBLISH_FOLDER_PATH) } } stage('Upload to Nexus') { steps { script { String groupPath = env.GROUP_ID.replace('.', '/') env.NEXUS_URL = "${env.NEXUS_REPO_URL}/${groupPath}/${env.ARTIFACT_ID}/${env.VERSION}" env.NEXUS_ARTIFACT_NAME = "${env.ARTIFACT_ID}-${env.FULL_VERSION}.${env.PACKAGING}" String nexusUploadUrl = "${env.NEXUS_URL}/${env.NEXUS_ARTIFACT_NAME}" uploadToNexus( env.NEXUS_CREDENTIALS_USR, env.NEXUS_CREDENTIALS_PSW, env.COMPRESSED_FILE_PATH, nexusUploadUrl) } } } stage('Create Metadata File') { steps { createMetadataFile( env.METADATA_FILENAME, env.GROUP_ID, env.ARTIFACT_ID, env.VERSION, env.NEXUS_URL, env.NEXUS_ARTIFACT_NAME) } } } post { success { echo "metadataFileName: ${env.METADATA_FILENAME}" archiveArtifacts artifacts: "${env.METADATA_FILENAME}", allowEmptyArchive: false build job: "${TRIGGER_JOB_NAME}", parameters: [ string(name: 'ENV', value: 'uat') ] } failure { echo 'Pipeline failed!' } always { echo 'Pipeline execution finished.' } } } //Thienvv- hàm checkout git void checkoutFromGit(String gitUrl, String credentialsId, String branch) { echo 'Start checkoutFromGit' try { checkout([$class : 'GitSCM', userRemoteConfigs: [[url: gitUrl, credentialsId: credentialsId]], branches : [[name: "*/${branch}"]]]) } catch (Exception e) { echo "[ERROR] Unexpected error: ${e.message}" throw e } } // Thienvv - hàm installDependencies void installDependencies(String buildFolderPath, String command) { echo 'Start installDependencies' try { if (!fileExists(buildFolderPath)) { error "buildFolderPath is not exist : ${buildFolderPath}" } dir("${buildFolderPath}") { Integer result = sh(script: "${command}", returnStatus: true) echo "result:${result}" if (result == 0) { echo 'install Dependencies successfully.' } else { error "install Dependencies failed with status: ${result}" } } } catch (Exception e) { error "Restore failed: ${e.message}" } } //Thienvv - build project void buildProject(String buildFolderPath, String command) { echo 'Start buildProject' try { if (!fileExists(buildFolderPath)) { error "buildFolderPath is not exist : ${buildFolderPath}" } // Build dự án Nuxt.js dir("${buildFolderPath}") { Integer result = sh(script: "${command}", returnStatus: true) echo "result:${result}" if (result == 0) { echo 'Build Project successfully' } else { error "Build Project failed, status: ${result}" } } } catch (Exception e) { error "Build Project failed: ${e.message}" } } //Thienvv - nén file void compressItems(String compressedFilePath, String parentFolderPath) { echo "Starting compression of the entire folder into a zip file : ${compressedFilePath}" try { if (!fileExists(parentFolderPath)) { error "parentFolderPath is not exist : ${parentFolderPath}" } dir(parentFolderPath) { // Thực hiện lệnh zip để nén tất cả các file trong thư mục Integer result = sh(script: "zip -r ${compressedFilePath} * ", returnStatus: true) // Kiểm tra kết quả if (result == 0) { echo "compressItems completed successfully: ${compressedFilePath}" } else { error "compressItems failed with exit code: ${result}." } } } catch (Exception e) { echo "[ERROR] Unexpected error: ${e.message}" throw e } } void uploadToNexus(String nexusUsername, String nexusPassword, String compressedFilePath, String uploadUrl) { echo "Starting upload ${compressedFilePath} To Nexus" try { // Truyền các biến môi trường vào lệnh sh mà không lộ ra trong log String result = sh(script: """ curl -u ${nexusUsername}:${nexusPassword} --upload-file ${compressedFilePath} ${uploadUrl} -w '%{http_code}' """, returnStdout: true).trim() if (result == '200' || result == '201') { echo 'uploadToNexus successfully' } else { error "uploadToNexus failed, HTTP status: ${result}" } } catch (Exception e) { echo "[ERROR] Unexpected error: ${e.message}" throw e } } void createMetadataFile( String metadataFileName, String groupId, String artifactId, String version, String nexusUrl, String nexusArtifactName) { echo 'Starting create metadata file' try { // Tạo metadata metadata = [ groupId: groupId, artifactId: artifactId, version: version, nexusUrl: nexusUrl, nexusArtifactName: nexusArtifactName ] // Ghi metadata vào file JSON writeJSON file: "${metadataFileName}", json: metadata if (!fileExists(metadataFileName)) { error "metadataFileName is not exist : ${metadataFileName}" } } catch (Exception e) { echo "[ERROR] Unexpected error: ${e.message}" throw e } }