Getting a build type error on cloud build that doesn't happen in docker build

Viewed 235

My Problem

I am getting an error ONLY when doing gcloud builds submit. My build is working locally and when creating a docker image locally. I am assuming that this is a problem where a file is not getting copied into the tarball correctly; however, in my debugging I found that it appears it is being copied.

My error:

Type error: Parameter 'service' implicitly has an 'any' type

Which is from some code that looks like this:

const {
    firestore,
    collections: {
      rentals: { services },
    },
  } = useFirebaseCtx();
const newServiceEvents = services.map((service, index) => {
   ...
})

Where useFirebaseCtx is extensively typed (with no explicit any inside it)

services has an explicit type of Organizations.Rentals.Services.Flat[]

Debugging I have tried

  1. When I run yarn run eslint . --ext .js,.jsx,.ts,.tsx I do not get any errors

  2. When I run docker build -t my-docker-image-name . I do not get any errors (and the image builds to completion)

  3. I have confirmed (by running gcloud meta list-files-for-upload) that my type folder is indeed being uploaded in the tarball

Abbreviated output of gcloud meta list-files-for-upload:

...
types/organizations/index.d.ts <- this is the file the type is defined in
...

Supplementary Files

.dockerignore

Dockerfile
.dockerignore
.gitignore
node_modules
npm-debug.log
README.md
.next
functions
fire*
jest*
__tests__

.gcloudignore

.gcloudignore
.git
.gitignore
node_modules
npm-debug.log
README.md
.next
functions
fire*
jest*
__tests__
!.env*
.env.development*

Dockerfile

# Install dependencies only when needed
FROM node:14-alpine AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock ./
# COPY ./private/sitemap/generate-sitemap.mjs ./private/sitemap/generate-sitemap.mjs
RUN yarn install --frozen-lockfile

# Rebuild the source code only when needed
FROM node:14-alpine AS builder
WORKDIR /app
COPY . .
COPY --from=deps /app/node_modules ./node_modules

ENV NODE_ENV production

# Failing here
RUN yarn build 

# Production image, copy all the files and run next
FROM node:14-alpine AS runner
WORKDIR /app


RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# You only need to copy next.config.js if you are NOT using the default configuration
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/.env* ./
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/next.config.js ./next.config.js

USER nextjs

EXPOSE 3000

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry.
# ENV NEXT_TELEMETRY_DISABLED 1

CMD ["yarn", "start"]
1 Answers

TL;DR

Don't name ANY folder firebase* inside your src code.

What was wrong

The problem was I had an internal folder named firebase that was not being included in the tarball. I had to rename the folder do that it would be included.

How I found what was wrong and my solution

  1. I went into the cloud console and downloaded the tarball (they give you a line in the CLI)
  2. CD'ed into the folder and ran yarn install
  3. I traced the error up the tree and found that I was missing an entire folder from my src folder
  4. I ran gcloud meta list-files-for-upload in my original folder and found the the files (firebase/*.(ts|tsx)) were not being included. I thus concluded that naming a folder "firebase" was a bad idea.
  5. Renamed the folder.

Another possible solution

Add the file as a don't ignore to your .gcloudignore

Related