Jenkins + Alibaba Cloud OSS 파이프라인 구축

발행일: 2025년 11월 12일·수정일: 2025년 12월 14일·기술·...

목표

React (Vite) 프로젝트를 main 브랜치에 푸시하면 Jenkins가 빌드 후 Alibaba Cloud OSS에 자동 배포


발생한 문제들

1. NoSuchMethodError: No such DSL method 'aliyunOSSUpload'

원인: 플러그인 설치 불량 또는 재시작 미실행

해결:

  • Jenkins 서버에서 플러그인 파일 수동 삭제 후 재설치
  • Jenkins 재시작 필수

  • 2. InvalidCredentialsException: Access key id should not be null or empty

    잘못된 코드:

    environment {
        ALIYUN_CREDS_ID = 'LTAI5tCrPDaDWZsjM7GNbigM' // ❌ 실제 Access Key
    }
    aliyunOSSUpload(credentialsId: env.ALIYUN_CREDS_ID, ...)
    

    원인credentialsId는 실제 Key 값이 아니라 Jenkins Credential에 등록된 항목 ID를 요구함

    해결:

  • Manage Jenkins > Credentials에서 Alibaba Cloud AK/SK 등록
  • Jenkinsfile 수정:
  • environment {
        ALIYUN_CREDS_ID = 'aliyun-oss-creds' // ✅ Credential ID
    }
    

    최종 Jenkinsfile

    pipeline {
        agent any
        environment {
            ALIYUN_CREDS_ID = 'aliyun-oss-creds'
            OSS_BUCKET = 'oss://voidx-ai-add-on'
        }
        stages {
            stage('Install') {
                steps { sh 'npm install' }
            }
            stage('Build') {
                steps { sh 'npm run build' }
            }
            stage('Upload to OSS') {
                steps {
                    script {
                        def bucketName = env.OSS_BUCKET.replace('oss://', '')
                        dir('dist') {
                            aliyunOSSUpload(
                                credentialsId: env.ALIYUN_CREDS_ID,
                                bucketName: bucketName,
                                filesPath: '**/*',
                                targetPath: '/'
                            )
                        }
                    }
                }
            }
        }
    
        post {
            always { deleteDir() }
        }
    }
    

    핵심 교훈

    {
      "object": "block",
      "id": "2c9ee4ee-251e-803c-bef1-d7e60d926dfc",
      "parent": {
        "type": "page_id",
        "page_id": "2a9ee4ee-251e-80e0-a6b4-c0b93391ae7d"
      },
      "created_time": "2025-12-14T06:39:00.000Z",
      "last_edited_time": "2025-12-14T06:39:00.000Z",
      "created_by": {
        "object": "user",
        "id": "dbb35ea8-dd87-4fd5-a4bd-719d5fa1096e"
      },
      "last_edited_by": {
        "object": "user",
        "id": "dbb35ea8-dd87-4fd5-a4bd-719d5fa1096e"
      },
      "has_children": true,
      "archived": false,
      "in_trash": false,
      "type": "table",
      "table": {
        "table_width": 3,
        "has_column_header": true,
        "has_row_header": false
      }
    }