TypeScript로 작성한 Cloud Functions를 CloudBuild를 사용하여 배포

이것을 읽고 할 수있게 될 것



TypeScript로 작성한 Cloud Function을 Code Build를 사용하여 배포할 수 있습니다.

전제 및 사전 준비



전제


  • CloudFunctions 코드는 webpack을 사용하여 요약됩니다.
  • Deploy는 serverless 명령이 아닌 gcloud 명령으로 수행됩니다.

    사전 준비


  • 과거 자료 CloudBuild 설정을 할 때까지

  • 테스트 리포지토리 : htps : // 기주 b. 코 m / 세 l rtsx / c ぉ d_ 그렇게 r 세 _ 레포시와 ry_ st

    설정



    디렉토리 구조


    cloud_source_repository_test git:(master) tree -I node_modules
    ├── README.md
    ├── cloudbuild.yaml
    ├── package-lock.json
    ├── package.json
    ├── src
    │   └── index.ts
    ├── tsconfig.json
    └── webpack.config.js
    

    TypeScript 샘플 코드



    webpack을 사용하여 코드가 올바르게 import되어 있는지 확인하기 위해 decimal.js를 import했습니다.
    import { Decimal } from "decimal.js";
    
    function subscribe(req: any, res: any){
      const x = new Decimal('0xff.f')
      return res.send(`Hello World! ${x}`);
    }
    
    export { subscribe }
    

    cloudbuild.yaml 설정


    steps:
      - name: node:8
        entrypoint: npm
        args:
        - install
    
      - name: node:8
        entrypoint: npm
        args:
        - run
        - build
    
      - name: 'gcr.io/cloud-builders/gcloud'
        args:
        - functions
        - deploy
        - subscribe
        - --stage-bucket=xxx
        - --trigger-http
    

    build 명령 중에서 webpack --mode production가 실행 중입니다.

    tsconfig.json 설정



    tsconfig.json
    {
      "compilerOptions": {
        "target": "es2017",
        "module": "commonjs",
        "strict": true,
        "preserveConstEnums": true,
        "strictNullChecks": true,
        "sourceMap": true,
        "outDir": "./", # <= 重要
        "moduleResolution": "node",
        "esModuleInterop": true
      },
      "include": [
        "src/**/*.ts"
      ],
      "exclude": [
        "node_modules"
      ]
    }
    

    Webpack 설정



    webpack.config.js
    module.exports = {
      entry: "./src/index.ts",
      target: 'node',
      output: {
        path: __dirname,
        filename: 'index.js',
        libraryTarget: 'this'
      },
      module: {
        rules: [
          {
            test: /\.tsx?$/,
            use: 'ts-loader'
          }
        ]
      },
      resolve: {
        extensions: [ '.js', '.json' ]
      }
    }
    

    IAM Role 설정





    동작 확인


    $ curl https://xxx.cloudfunctions.net/subscribe
    Hello World! 255.9375%
    

    비고



    webpack을 사용하는 이유


  • node_modules도 Cloud Function에 업로드하면 webpack을 사용할 필요가 없습니다
  • CodeBuild 내에서 Build 및 deploy를하기 때문에 Development 환경 용 package도 install은 필수
  • Development 환경의 패키지도 gcloud 명령으로 배포하면 파일 크기가 커집니다.

    나머지 작업


  • IAM의 커스텀 롤을 terraform으로 만들고 싶다
  • debug에 대한 sourceMap을 설정하고 싶습니다.
  • htps : // 푹 빠져라. 오, ぇ. 코 m / 드 cs / 훙 c 치온 s / ty ぺ sc 리 pt? hl = 그럼

  • webpack externals 설정 공부
  • htps : // 우ぇ b 파크. js. 오 rg / 곤후 쿠라 치온 / e x r ls /

  • 좋은 웹페이지 즐겨찾기