diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index d4fb9d0..aaf7308 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -45,7 +45,5 @@ jobs: - uses: ./.github/actions/node-install with: token: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/build-push-action@v6 - with: - context: . - target: playground + - run: | + pnpm docker:build diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 1bb50ec..0000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:24-slim AS base - -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" - -RUN corepack enable - -FROM base AS build - -COPY . /usr/src/app -WORKDIR /usr/src/app -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile -RUN pnpm build -RUN pnpm deploy --legacy --filter=monorepo-typescript-playground --prod /prod/playground - -FROM nginx:stable AS playground - -COPY packages/playground/.docker/nginx.conf /etc/nginx/conf.d/default.conf -COPY packages/playground/.docker/expires.conf /etc/nginx/conf.d/expires.conf - -WORKDIR /app -COPY --from=build /prod/playground/dist /app diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 4e2b9ce..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,8 +0,0 @@ -services: - playground: - build: - context: . - target: playground - ports: - - '8080:80' - tty: true diff --git a/package.json b/package.json index e79804d..625e142 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "monorepo-typescript", "private": true, "author": "Coldrun ", - "homepage": "https://github.com/coldrun/monorepo-typescript", + "repository": "https://github.com/coldrun/monorepo-typescript", "type": "module", "packageManager": "pnpm@10.30.1", "engineStrict": true, @@ -13,7 +13,7 @@ "scripts": { "dev": "pnpm -r --parallel run dev", "build": "pnpm -r run build", - "build:docker": "pnpm -r --stream run build:docker", + "docker:build": "pnpm -r --stream run docker:build", "clean": "rimraf --glob packages/*/dist apps/*/dist temp .eslintcache", "clean:all": "pnpm clean && rimraf --glob node_modules packages/*/node_modules apps/*/node_modules", "format": "prettier . --write --ignore-unknown", diff --git a/packages/playground/Dockerfile b/packages/playground/Dockerfile new file mode 100644 index 0000000..de739e4 --- /dev/null +++ b/packages/playground/Dockerfile @@ -0,0 +1,39 @@ +FROM node:24-slim AS base + +ARG ENV=prod + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/* +RUN corepack enable + +FROM base AS build + +WORKDIR /app + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc tsconfig.json ./ +COPY packages/core packages/core +COPY packages/shared packages/shared +COPY packages/playground packages/playground + +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ + --mount=type=secret,id=npmrc,target=/root/.npmrc \ + pnpm install --frozen-lockfile +RUN pnpm build + +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ + --mount=type=secret,id=npmrc,target=/root/.npmrc \ + pnpm deploy --legacy --filter="@coldrun/monorepo-typescript-playground" --prod /app/deploy + +FROM nginx:stable AS playground + +COPY packages/playground/.docker/nginx.conf /etc/nginx/conf.d/default.conf +COPY packages/playground/.docker/expires.conf /etc/nginx/conf.d/expires.conf + +COPY --from=build /app/deploy/dist /app +COPY --from=build /app/deploy/node_modules /app/node_modules + +RUN ls -al /app +RUN ls -al /app/node_modules +#ENTRYPOINT ["node", "main.js"] diff --git a/packages/playground/package.json b/packages/playground/package.json index 2dd4272..9458c78 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "build:docker": "node ../../scripts/docker build playground", + "docker:build": "node ../../scripts/docker.js build playground", + "docker:push": "node ../../scripts/docker.js push playground", "preview": "vite preview" }, "dependencies": { diff --git a/scripts/docker.js b/scripts/docker.js index b47b809..aaee844 100644 --- a/scripts/docker.js +++ b/scripts/docker.js @@ -14,26 +14,26 @@ const packages = fs.readdirSync(packagesPath); const { docker: { registry }, - homepage, + repository, } = createRequire(`${rootPath}/`)('./package.json'); -const { version } = createRequire(`${rootPath}/`)('./lerna.json'); const exec = (bin, args, opts = {}) => execa(bin, args, { stdio: 'inherit', cwd: rootPath, ...opts }); -const imageInfo = (target, tag) => { +function imageInfo(target, { tag }) { if (!packages.includes(target)) { throw new Error(`Invalid target: '${target}'`); } const targetPath = `${packagesPath}/${target}`; const targetPackage = createRequire(import.meta.url)(`${targetPath}/package.json`); - const name = targetPackage.name.replace('@', ''); - const packageName = `${registry}/${name}`; - const currentImage = `${packageName}:v${version}`; - const tagImage = `${packageName}:${tag}`; + const name = targetPackage.name.split('/').pop(); + const tagName = tag || 'latest'; - return { packageName, currentImage, tagImage }; -}; + const imageName = `${registry}/${name}`; + const image = `${imageName}:${tagName}`; + + return { imageName, image, targetPath }; +} yargs(hideBin(process.argv)) .command( @@ -45,18 +45,18 @@ yargs(hideBin(process.argv)) }, async (args) => { const { target, tag, verbose } = args; - const { currentImage, tagImage } = imageInfo(target, tag); + const { image, targetPath } = imageInfo(target, { tag }); const dockerArgs = [ 'build', '.', - '--target', - target, + '-f', + `${targetPath}/Dockerfile`, '--label', - `org.opencontainers.image.source=${homepage}`, - '-t', - currentImage, + `org.opencontainers.image.source=${repository}`, '-t', - tagImage, + image, + '--secret', + `id=npmrc,src=${process.env.HOME}/.npmrc`, ]; if (verbose) { dockerArgs.push('--progress', 'plain'); @@ -69,19 +69,24 @@ yargs(hideBin(process.argv)) 'push ', 'push docker image', { - tag: { alias: 't', default: 'latest' }, verbose: { alias: 'v', type: 'boolean' }, }, async (args) => { - const { target, tag, verbose } = args; - const { packageName } = imageInfo(target, tag); - const dockerArgs = ['push', packageName, '-a']; - if (verbose) { - dockerArgs.push('--progress', 'plain'); - } - console.log('Running docker:', dockerArgs.join(' ')); - await exec('docker', dockerArgs); + const { target, verbose } = args; + const { image } = imageInfo(target, {}); + + const push = async (args) => { + if (verbose) { + args.push('--progress', 'plain'); + } + console.log('Running docker:', args.join(' ')); + await exec('docker', args); + }; + + const dockerArgs = ['push', image]; + await push(dockerArgs); }, ) .help() + .demandCommand() .parse();