[컴] Jenkins job 을 xml 로 export

http://jenkins_url/ : https://inhouse.foodpang.co/ci/

젠킨스 / 사용법 / 백업 / export / import / 복사

 

update 2023-03-24

jenkins pipeline 을 이용하는 것이 더 나아 보인다.

Jenkins job 을 xml 로 export

jenkins command line 을 이용하는 방법들

2가지 방법이 있다.

  1. ssh 로 command 를 날리는 방법
    • jenkins 서버를 설치하면, 이 값은 기본적으로 disable 되어 있다.
    • ssh 연결
    • SSH-based public/private key 인증을 사용한다. 그래서 jenkins 서버에 public key 등록을 해야 한다.
  2. jenkins cli client 를 사용하는 방법
    • ssh, http, websocket 방식으로 통신할 수 있다.

jenkins cli client

  • 다운로드: http://jenkins_url/jnlpJars/jenkins-cli.jar 로 접근하면 download 가 된다.

실행:

java -jar jenkins-cli.jar -s http://jenkins_url/ -auth <id>:<pw> help
...
  create-job
    Creates a new job by reading stdin as a configuration XML file.
  create-node
    Creates a new node by reading stdin as a XML configuration.
  create-view
    Creates a new view by reading stdin as a XML configuration.
...
  get-job
    Dumps the job definition XML to stdout.
  get-node
    Dumps the node definition XML to stdout.
  get-view
    Dumps the view definition XML to stdout.
...

job 을 xml 로 export

get-job :

java -jar jenkins-cli.jar -s http://jenkins_url/ -auth <id>:<pw> get-job myjobfolder > out-group.xml
java -jar jenkins-cli.jar -s http://jenkins_url/ -auth <id>:<pw> get-job myjobfolder/myjob > out.xml

job 을 xml 을 이용해서 생성

create-job :

java -jar jenkins-cli.jar -s http://jenkins_url/ -auth <id>:<pw> create-job myjobfolder2 < out-group.xml
java -jar jenkins-cli.jar -s http://jenkins_url/ -auth <id>:<pw> create-job myjobfolder2/mynewjob < out.xml

[컴] spring 에서 ’/static’외 다른 url 을 /static directory 로 접근하도록 하는 법

스프링 / static path 지정 /

spring 에서 ’/static’외 다른 url 을 /static directory 로 접근하도록 하는 법

아래는 mystatic/static/** 로 시작하는 url 들을 /static/** 처럼 처리하도록 해주는 code 이다.

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/mystatic/static/**")
          .addResourceLocations("classpath:/static/");

        registry
          .addResourceHandler("/mystatic2/static/**")
          .addResourceLocations("classpath:/static2/");
    }
}

.properties 에서 아래의 설정을 이용해서 추가할 수 있다. 단 아래의 설정에서는 spring.mvc.static-path-pattern 에 1개의 path 만 지정이 된다.

# application.properties
spring.mvc.static-path-pattern=/mystatic/static/**
spring.resources.static-locations=classpath:/static/,file:/opt/files

[컴][웹] server-side rendering, client-side rendering

 

무엇이 나은가? nextjs / reactjs / nuxtjs / vuejs / ssr / csr /

server-side rendering, client-side rendering

next.js 인가 reactjs 인가에 대한 고민이 있어서 몇가지 사항을 정리해 본다.

다음 글에서, server-side rendering, client-side rendering 의 정도에 따라 어떤 면이 유리한지를 정리해 준다.

어느쪽이 나을까? 일관성을 위해서, 하나의 방법으로 모든 page 에 사용하는 것이 좋아보이긴 한다.

개인적으로 선호하는 쪽은 CSRB(Client Side Rendering with Boostrapped Data) 이다. 다만 이경우, 조금은 복잡한 행위가 필요하다. server side 에서 template engine 을 다루고, client side 에서 react 관련 작업을 따로 해야한다. 그래서 결과적으로 이 방법은 대부분의 경우 좋은 방법이 아닐 수 있다.

next.js vs react.js

다음 글은 Next.js 와 React.js 에 대한 비교 글이다. 여기서는 비교적 간단한 결론을 내리게 해준다. 대체로 search engine 에 노출되는 것이 필요한 경우 static page 가 필요하게 되는데, 이런 경우 Next.js 를 사용하라고 한다.

React.js 로 next.js 를 사용하지 않고, 비슷한 효과를 얻는 방법이 있지 않을까 찾아봤지만, CSRB 외에 특별한 방법을 찾긴 힘들었다.

SSR 을 사용하지 않는 Nextjs 방법에 대한 글도 있다.

SSG vs SSR

from: 10 Web Development Trends in 2023

SSR has been competing with static site generation (SSG) for quite a while for the perfect performance (see Next.js vs Gatsby.js) even though both patterns serve entirely different purposes. While the latter pattern is used for static content (e.g. websites like a blog), the former is used for dynamic content (e.g. web applications). If SEO is relevant, both SSR and SSG can make sense. However, with the requirement of highly dynamic content or user-centered content with authentication, developers cannot choose SSG (once build before deploy, therefore static) and have to decide between SSR (on-demand build per request with individual data on the server) or CSR (on-demand fetching of individual data on the client) these days.

SSR은 두 패턴이 완전히 다른 용도로 사용되지만 완벽한 성능을 위해 꽤 오랫동안 정적 사이트 생성(SSG)과 경쟁해 왔습니다(Next.js vs Gatsby.js 참조). 후자의 패턴은 정적 콘텐츠(예: 블로그와 같은 웹사이트)에 사용되는 반면, 전자는 동적 콘텐츠(예: 웹 애플리케이션)에 사용됩니다. SEO와 관련해선 SSR과 SSG 모두 의미가 있을 수 있다. 그러나 매우 동적인 콘텐츠나 인증이 필요한 사용자 중심 콘텐츠가 필요한 경우 개발자는 SSG(배포 전에 한 번 빌드하기에 static)를 선택할 수 없으며, 요즘에는 SSR(서버의 개별 데이터로 요청에 따라 온디맨드 빌드) 또는 CSR(클라이언트에서 개별 데이터의 온디맨드 페칭) 중에서 결정해야 한다.

[컴] next js 시작하기

nextjs / react / commerce / client

next js 시작하기

여기서는 pnpm(pnpm - npm) 을 사용한다.

next-app 생성

pnpm create next-app --typescript

위처럼 하면, 아래의 package를 설치하고, run script 를 set 한 것과 같다. --typescript는 typescript 를 사용할 때 사용하는 option 이다.

pnpm add next react react-dom

logs:

c:\myproj\nextjs>pnpm create next-app --typescript
../../../../.pnpm-store/v3/tmp/dlx-12440 |   +1 +
Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: d:\.pnpm-store\v3
  Virtual store is at:             ../../../../.pnpm-store/v3/tmp/dlx-12440/node_modules/.pnpm
../../../../.pnpm-store/v3/tmp/dlx-12440 | Progress: resolved 1, reused 1, downloaded 0, added 1, done
√ What is your project named? ... sashow-client
√ Would you like to use ESLint with this project? ... No / Yes
√ Would you like to use `src/` directory with this project? ... No / Yes
√ Would you like to use experimental `app/` directory with this project? ... No / Yes
√ What import alias would you like configured? ... @/*
Creating a new Next.js app in c:\myproj\nextjs\sashow-client.

Using pnpm.

Installing dependencies:
- react
- react-dom
- next
- @next/font
- typescript
- @types/react
- @types/node
- @types/react-dom
- eslint
- eslint-config-next

Packages: +267
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: d:\.pnpm-store\v3
  Virtual store is at:             node_modules/.pnpm
Progress: resolved 279, reused 267, downloaded 0, added 267, done

dependencies:
+ @next/font 13.1.6
+ @types/node 18.11.19
+ @types/react 18.0.27
+ @types/react-dom 18.0.10
+ eslint 8.33.0
+ eslint-config-next 13.1.6
+ next 13.1.6
+ react 18.2.0
+ react-dom 18.2.0
+ typescript 4.9.5

Done in 22.8s

Initializing project with template: default

Initialized a git repository.

Success! Created sashow-client at c:\myproj\nextjs\sashow-client

dev server

pnpm dev 를 하면, 개발서버를 띄워준다.

웹브라우저에서 http://localhost:3000 를 통해 접근할 수 있다.

cd myproj
pnpm dev

pages

다음처럼 pages 에 있는 file 이 compile 돼서, .next\static\chunks\pages 안으로 가게 된다.

  • c:\myproj\src\pages\index.tsx –> c:\myproj\.next\static\chunks\pages\index.js

page 안에 React component 를 만들어서 넣으면, 그 경로의 page로 만들어준다.

예를 들어, pages/mypage.tsx 파일을 만들어 넣으면, http://localhost:3000/mypage 에 접근하면 해당 component 가 보여진다. 사용가능한 확장자는 js, jsx, ts, tsx 이다.

dynamic routes

dynamic routes 도 된다. 예를 들어

pages/posts/[id].tsx 를 만들면, http://localhost:3000/posts/1, http://localhost:3000/posts/2 , … 등의 접근이 가능하다.

rendering

2개 방식이 있다.

  • 하나는 static page 를 만드는 것 : Nextjs 에서는 이것을 추천한다. 그리고, 이것이 CDN 등에서 cache 를 할 수 있기에 더 효율적이다.
  • 다른 하나는 server-side rendering

이다.

rendering, static generation

next build 를 하면 된다. package.json 의 run script 에 이미 있기에 아래처럼 build 를 하면 된다.

pnpm build

getStaticProps

static page를 만들때 server에서 data 를 가져와서 보여주는 경우에 대한 처리도 가능하다. 이를 위해서 getStaticProps라는 함수를 export 해줘야 한다.

export 방법:

이 함수는 page 에서만 가능하다. page가 아닌 _app 등의 file 에서는 작동하지 않는다. 이 함수는 standalone function 으로 export 해야 한다. page component 의 property 로 추가하면 build 시점에 동작하지 않는다. (참고)

next dev 시:

next dev 시점에는 getStaticProps는 매 request 마다 호출된다.(참고)

동작:

이 함수는 next build 시점에 수행된다. 이 getStaticProps 는 build 타임에 server쪽에 request 를 날리게 해주는 것이라서, server 에 날리는 request 가 client 에서 수행되지 않는다. 그래서 server 에서 사용하는 함수를 그대로 써서 database 에 직접접근해서 data 를 가져와도 된다고 한다.(참고)

me: 개인적으로 getStaticProps 에서 was 를 통하지 않고, database를 직접 호출하는 방법을 선호하지 않는다. 이렇게 되면, 결국 이전에 web server 에서 사용하던 template 과 크게 다를바 없다. 그전에도 그것의 문제는 code가 너무 얽혀서, 코드를 이해하는 것을 어렵게 한다.

배포시 JSON으로 배포:

getStaticProps 로 요청된 값은 JSON 으로 저장돼서 deploy 된다. 그래서 client code 에서 getStaticProps 를 호출하는 code 는 build 시점에 JSON 을 호출하는 코드로 변경된다.(참고)

getStaticProps를 사용해야 하는 경우:

  • 페이지를 렌더링하는 데 필요한 데이터가 빌드 시점에 사용 가능한 경우: 예를 들면, 사용자에 따라 바뀌지 않는 data 들, 항상 같은 data 들이 있을 수 있다. 대체로 static 한 정보들, 예를 들면 faq 같은 것들.
  • 데이터가 headless CMS(content management system)에서 제공됩니다.
  • 페이지가 사전 렌더링되어야 하고(SEO를 위해) 매우 빨라야 한다. getStaticProps는 성능을 위해 CDN에서 캐시할 수 있는 HTML 및 JSON 파일을 생성한다.
  • 데이터가 공개적으로 캐시될 수 있다(사용자별이 아님). 특정 상황에서는 미들웨어를 사용하여 경로를 다시 작성함으로써 이 조건을 우회할 수 있다. : middleware 이야기는 아마도 cache 된 것을 사용하지 않고, 새로운 page 를 접근하게 하는 방법인듯.

배포

next build를 하면 .next folder에 만들어진다.

자신의 WAS(Web Application Server) 에 deploy 하기

Reserence

  1. Getting Started | Next.js

[컴] pnpm

node package manager / pnpm /

pnpm

pnpm 은 npm 처럼 package manager 이다. 사용방법도 유사하다.

pnpm 은 간략히 이야기하면, 기존의 dependency 들이 recursive 했었는데, 이것을 link (windows 에선 junction)등을 사용해서 recursive 한 node_modules 를 flat 한 구조로 해서 package 를 관리하는 툴이다.

대략적으로 npm i 를 통해 dependency 들을 설치하면 아래와 같은 구조를 갖게 된다.

- node_modules
    - <packageA>
        - node_modules
            - <packageB for packageA>

그런데 이 구조를 하나의 directory 에 dependency 를 모아놓고, 반복되는 package들을 link 로 연결하는 방법을 취한다.

아래는 한 예이다.

directory 이름이 바뀌는 경우

windows 에서 테스트해봤을때, root directory 의 이름이 변경되는 경우 다시 pnpm i를 해줘야 했다. 아마 경로가 절대 경로로 c:\.pnpm-store 에 저장돼는 것 같다. 하지만 pnpm i 를 한다고 해서 다시 download 를 하는 것 같진 않다. 아마 caching 되어 있는 library 에 대해 link 를 변경해주는 것이 아닐까 싶다(추측)

[컴][웹] vercel/commerce 에서 turbo run dev

 

vendure client / vendure react client / reactjs client / nextjs client / 왜 port 가 3000 인가 / default port 3000 /

vercel/commerce 에서 turbo run dev

turbo run dev 를 하면 /packages 안의 package.json 의 dev script 를 실행해준다.

  • /packages/vendure/package.json 를 확인하면, taskr 을 수행한다.
  • /site/package.json 를 확인하면, next dev 를 한다.

/packages/vendure/package.json

{
  "name": "@vercel/commerce-vendure",
  ...
  "scripts": {
    "release": "taskr release",
    "build": "taskr build",
    "dev": "taskr",
    ...
  }
  ...
}

/packages/vendure/taskfile.js 를 보면 taskr 을 수행하면 default export 인 dev 가 실행된다.

export async function build(task, opts) {
  await task
    .source('src/**/*.+(ts|tsx|js)')
    .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' })
    .target('dist')
    .source('src/**/*.+(cjs|json)')
    .target('dist')
  task.$.log('Compiled src files')
}

export async function release(task) {
  await task.clear('dist').start('build')
}

export default async function dev(task) {
  const opts = { dev: true }
  await task.clear('dist')
  await task.start('build', opts)
  await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts)
} 

watch 실행

watch 는 file 이 변경될 때 알아서, build 해준다. 위 code 를 보면 자체적으로 만든 taskr-watch 를 사용하는 듯 하다.

/site/package.json

next.js 의 next dev 를 이용하는 듯 하다.

다음 code 들을 보면, port 3000 이 사용됨을 확인할 수 있다.

- /site/node_modules/next/dist/build/utils.js
- /site/node_modules/next/dist/esm/build/utils.js
- /site/node_modules/next/dist/esm/server/lib/utils.js
- /site/node_modules/next/dist/server/lib/utils.js

// /site/package.json

{
  "name": "next-commerce",
  ...
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start", 
  },
  ...
  "devDependencies": {
    "@next/bundle-analyzer": "^12.0.8", 
    ...
  }
}

See Also

  1. 쿠…sal: [컴][웹] next.js commerce + vendure 서버 실행

[컴][웹] next.js commerce + vendure 서버 실행

넥스트js / nextjs /넥스트 / nextjs comerce / vendure server

next.js commerce + vendure 서버 실행

  • nextjs commerce git repo: https://github.com/vercel/commerce

build 및 실행

  1. pnpm i
  2. vendure server 실행
  1. pnpm dev : pnpm dev를 하면 turbo run dev 를 실행한다. watch 가 설정된다. 그래서 dynamic reload 가 돼서 파일을 수정하면 알아서 compile을 해서 반영해준다.
  • localhost:3031 로 서버를 띄운다. : 원래는 3030 port 를 사용하지만, vendure 에서 3030을 사용중이면, 알아서 3031로 잡히게 된다
Microsoft Windows [Version 10.0.19044.2604]
(c) Microsoft Corporation. All rights reserved.

C:\Users\namh>cd /d d:\a\prog\sashow\prod\sashow-server

d:\a\prog\sashow\prod\sashow-server>cd d:\a\prog\sashow\sashow_client

d:\a\prog\sashow\sashow_client>pnpm dev

> commerce@ dev d:\a\prog\sashow\sashow_client
> turbo run dev

• Packages in scope: @vercel/commerce, @vercel/commerce-local, @vercel/commerce-vendure, next-commerce, taskr-swc
• Running dev in 5 packages
@vercel/commerce-vendure:dev: cache bypass, force executing 029abb2ac2fd88f2
next-commerce:dev: cache bypass, force executing 2a2fe1c5b8ef135c
@vercel/commerce:dev: cache bypass, force executing 21a4e36542781002
@vercel/commerce-local:dev: cache bypass, force executing 3e573f5a99e58aa5
@vercel/commerce-local:dev:
@vercel/commerce-local:dev: > @vercel/commerce-local@0.0.1 dev D:\a\prog\sashow\sashow_client\packages\local
@vercel/commerce-local:dev: > taskr
@vercel/commerce-local:dev:
@vercel/commerce:dev:
@vercel/commerce:dev: > @vercel/commerce@0.0.1 dev D:\a\prog\sashow\sashow_client\packages\commerce
@vercel/commerce:dev: > taskr
@vercel/commerce:dev:
@vercel/commerce-vendure:dev:
@vercel/commerce-vendure:dev: > @vercel/commerce-vendure@0.0.1 dev D:\a\prog\sashow\sashow_client\packages\vendure
@vercel/commerce-vendure:dev: > taskr
@vercel/commerce-vendure:dev:
next-commerce:dev:
next-commerce:dev: > next-commerce@0.0.1 dev D:\a\prog\sashow\sashow_client\site
next-commerce:dev: > next dev
next-commerce:dev:
@vercel/commerce-local:dev: [16:35:04] Running with D:\a\prog\sashow\sashow_client\packages\local\taskfile.js
@vercel/commerce-local:dev: [16:35:04] Starting default
@vercel/commerce-local:dev: [16:35:04] Starting build
@vercel/commerce:dev: [16:35:04] Running with D:\a\prog\sashow\sashow_client\packages\commerce\taskfile.js
@vercel/commerce:dev: [16:35:04] Starting default
@vercel/commerce:dev: [16:35:04] Starting build
@vercel/commerce-vendure:dev: [16:35:04] Running with D:\a\prog\sashow\sashow_client\packages\vendure\taskfile.js
@vercel/commerce-vendure:dev: [16:35:04] Starting default
@vercel/commerce-vendure:dev: [16:35:04] Starting build
next-commerce:dev: warn  - Port 3000 is in use, trying 3001 instead.
next-commerce:dev: ready - started server on 0.0.0.0:3001, url: http://localhost:3001
next-commerce:dev: info  - Loaded env from D:\a\prog\sashow\sashow_client\site\.env.local
@vercel/commerce-local:dev: [16:35:04] Compiled src files
@vercel/commerce-local:dev: [16:35:04] Finished build in 181ms
@vercel/commerce-local:dev: [16:35:04] Watching files...
@vercel/commerce-vendure:dev: [16:35:04] Compiled src files
@vercel/commerce-vendure:dev: [16:35:04] Finished build in 292ms
@vercel/commerce-vendure:dev: [16:35:04] Watching files...
@vercel/commerce:dev: [16:35:04] Compiled src files
@vercel/commerce:dev: [16:35:04] Finished build in 353ms
@vercel/commerce:dev: [16:35:04] Watching files...
@vercel/commerce-local:dev: [16:35:04] Finished default in 562ms
next-commerce:dev: next.config.js {
next-commerce:dev:   "commerce": {
next-commerce:dev:     "provider": "vendure",
next-commerce:dev:     "features": {
next-commerce:dev:       "cart": true,
next-commerce:dev:       "search": true,
next-commerce:dev:       "wishlist": false,
next-commerce:dev:       "customerAuth": false,
next-commerce:dev:       "customCheckout": false
next-commerce:dev:     }
next-commerce:dev:   },
next-commerce:dev:   "i18n": {
next-commerce:dev:     "locales": [
next-commerce:dev:       "en-US",
next-commerce:dev:       "es"
next-commerce:dev:     ],
next-commerce:dev:     "defaultLocale": "en-US"
next-commerce:dev:   },
next-commerce:dev:   "experimental": {
next-commerce:dev:     "esmExternals": "loose"
next-commerce:dev:   },
next-commerce:dev:   "images": {
next-commerce:dev:     "domains": [
next-commerce:dev:       "localhost",
next-commerce:dev:       "demo.vendure.io",
next-commerce:dev:       "readonlydemo.vendure.io"
next-commerce:dev:     ]
next-commerce:dev:   },
next-commerce:dev:   "env": {
next-commerce:dev:     "COMMERCE_CART_ENABLED": true,
next-commerce:dev:     "COMMERCE_SEARCH_ENABLED": true
next-commerce:dev:   }
next-commerce:dev: }
next-commerce:dev: warn  - Invalid next.config.js options detected:
next-commerce:dev:   - The root value has an unexpected property, commerce, which is not in the list of allowed properties (amp, analyticsId, assetPrefix, basePath, cleanDistDir, compiler, compress, crossOrigin, devIndicators, distDir, env, eslint, excludeDefaultMomentLocales, experimental, exportPathMap, generateBuildId, generateEtags, headers, httpAgentOptions, i18n, images, onDemandEntries, optimizeFonts, output, outputFileTracing, pageExtensions, poweredByHeader, productionBrowserSourceMaps, publicRuntimeConfig, reactStrictMode, redirects, rewrites, sassOptions, serverRuntimeConfig, staticPageGenerationTimeout, swcMinify, trailingSlash, typescript, useFileSystemPublicRoutes, webpack).
next-commerce:dev:
next-commerce:dev: See more info here: https://nextjs.org/docs/messages/invalid-next-config
next-commerce:dev: warn  - You have enabled experimental feature (esmExternals) in next.config.js.
next-commerce:dev: warn  - Experimental features are not covered by semver, and may cause unexpected or broken application behavior. Use at your own risk.
next-commerce:dev:
@vercel/commerce-vendure:dev: [16:35:04] Finished default in 722ms
@vercel/commerce:dev: [16:35:04] Finished default in 677ms
next-commerce:dev: event - compiled client and server successfully in 1601 ms (781 modules)

쓸데없는 package 삭제

만약 @vercel/commerce-vendure package만 남긴다고 해보자.

  1. npm unistall

    • npm uninstall @vercel/commerce-bigcommerce @vercel/commerce-commercejs @vercel/commerce-kibocommerce @vercel/commerce-ordercloud @vercel/commerce-saleor @vercel/commerce-sfcc @vercel/commerce-shopify @vercel/commerce-spree @vercel/commerce-swell
  2. package folder 삭제 packages 들에 다음 folder만 남긴다.

    • packages/
      • commerce/
      • local/
      • taskr-swc/
      • vendure/

vendure 실행

  1. vendure 사용해 보기(빌드 및 실행)
  2. vendure 설치 및 개발용 서버 실행

See Also

  1. 쿠…sal: [컴][웹] next.js commerce에서 provider 분석
  2. 쿠…sal: [컴][웹] vercel/commerce 에서 turbo run dev
  3. 쿠…sal: [컴] nextjs commerce 의 Layout 설정
  4. 쿠...sal: [컴][웹] nextjs commerce 에서 SWR handler.useHook 이 호출되는 과정
  5. 쿠...sal: [컴] nextjs commerce 에서 login 의 동작
  6. 쿠...sal: [컴][웹] vendure server 에서 회원가입, 유저생성, create user 
  7. 쿠...sal: [컴][웹] vendure 의 Session 관리
  8. 쿠...sal: [컴] vendure 의 storefront 구현
  9. 쿠...sal: [컴][웹] nextjs commerce 에 debugger 붙이기
  10. 쿠...sal: [컴] vendure 서버에 debugger 를 붙이기