diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000..4a617a9f --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,85 @@ +name: release-test +run-name: release-test ${{ github.actor }} +on: + push: + tags: + - "version-[0-9]+.[0-9]+.[0-9]+" + workflow_dispatch: +env: + REGISTRY: docker.frappet.com + IMAGE_NAME: ehr/bma-ehr-org-service + DEPLOY_HOST: frappet.com + COMPOSE_PATH: /home/frappet/docker/bma-ehr-org +jobs: + # act workflow_dispatch -W .github/workflows/release.yaml --input IMAGE_VER=test-v1 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd + release-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + # skip Set up QEMU because it fail on act and container + # Gen Version try to get version from tag or inut + - name: Set output tags + id: vars + run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT + - name: Gen Version + id: gen_ver + run: | + if [[ $GITHUB_REF == 'refs/tags/'* ]]; then + IMAGE_VER=${{ steps.vars.outputs.tag }} + else + IMAGE_VER=${{ github.event.inputs.IMAGE_VER }} + fi + if [[ $IMAGE_VER == '' ]]; then + IMAGE_VER='test-vBeta' + fi + echo '::set-output name=image_ver::'$IMAGE_VER + - name: Check Version + run: | + echo $GITHUB_REF + echo ${{ steps.gen_ver.outputs.image_ver }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login in to registry + uses: docker/login-action@v2 + with: + registry: ${{env.REGISTRY}} + username: ${{secrets.DOCKER_USER}} + password: ${{secrets.DOCKER_PASS}} + - name: Build and push docker image + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64 + push: true + tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest + - name: Remote Deployment + uses: appleboy/ssh-action@v0.1.8 + with: + host: ${{env.DEPLOY_HOST}} + username: frappet + password: ${{ secrets.SSH_PASSWORD }} + port: 22 + script: | + cd "${{env.COMPOSE_PATH}}" + docker-compose pull + docker-compose up -d + echo "${{ steps.gen_ver.outputs.image_ver }}"> success + - uses: snow-actions/line-notify@v1.1.0 + if: success() + with: + access_token: ${{ secrets.TOKEN_LINE }} + message: | + -Success✅✅✅ + Image: ${{env.IMAGE_NAME}} + Version: ${{ steps.gen_ver.outputs.IMAGE_VER }} + By: ${{secrets.DOCKER_USER}} + - uses: snow-actions/line-notify@v1.1.0 + if: failure() + with: + access_token: ${{ secrets.TOKEN_LINE }} + message: | + -Failure❌❌❌ + Image: ${{env.IMAGE_NAME}} + Version: ${{ steps.gen_ver.outputs.IMAGE_VER }} + By: ${{secrets.DOCKER_USER}} diff --git a/Dockerfile b/Dockerfile index 98a42722..4ca0f482 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,24 +1,35 @@ -FROM node:20-slim AS base - -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" - -RUN corepack enable +FROM node:18-alpine as builder +# Create app directory WORKDIR /app +# Install app dependencies +COPY package*.json ./ + +RUN npm ci + COPY . . -FROM base AS deps -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile +RUN npm run build -FROM base AS build -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile -RUN pnpm run build +FROM node:18-alpine -FROM base as prod -COPY --from=deps /app/node_modules /app/node_modules -COPY --from=build /app/dist /app/dist -COPY --from=base /app/static /app/static +ENV NODE_ENV production +USER node -CMD ["node", "./dist/app.js"] +# Create app directory +WORKDIR /app + +# Install app dependencies +COPY package*.json ./ +# COPY .env ./ + +RUN npm ci --production + +COPY --from=builder /app/dist ./dist + +# COPY entrypoint.sh /usr/local/bin/entrypoint.sh +# RUN chmod u+x /usr/local/bin/entrypoint.sh + +# ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD [ "node", "dist/app.js" ] \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 7ff0242d..05bb7fd5 100644 --- a/src/app.ts +++ b/src/app.ts @@ -13,9 +13,11 @@ async function main() { const app = express(); - app.use(cors({ - origin: "*", - })); + app.use( + cors({ + origin: "*", + }), + ); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use("/", express.static("static")); @@ -24,15 +26,18 @@ async function main() { RegisterRoutes(app); app.use(error); - const APP_HOST = process.env.APP_HOST || "0.0.0.0"; const APP_PORT = +(process.env.APP_PORT || 3000); // app.listen(APP_PORT, APP_HOST, () => console.log(`Listening on: http://localhost:${APP_PORT}`)); - app.listen(APP_PORT, APP_HOST, () => ( - console.log(`[APP] Application is running on: http://localhost:${APP_PORT}`), - console.log(`[APP] Swagger on: http://localhost:${APP_PORT}/api-docs`) - ), ); + app.listen( + APP_PORT, + APP_HOST, + () => ( + console.log(`[APP] Application is running on: http://localhost:${APP_PORT}`), + console.log(`[APP] Swagger on: http://localhost:${APP_PORT}/api-docs`) + ), + ); } main(); diff --git a/src/database/data-source.ts b/src/database/data-source.ts index 98ab5dd4..470334b0 100644 --- a/src/database/data-source.ts +++ b/src/database/data-source.ts @@ -9,7 +9,7 @@ export const AppDataSource = new DataSource({ port: +(process.env.DB_PORT || 3306), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, - synchronize: true, + synchronize: false, logging: true, entities: ["src/entities/**/*.ts"], migrations: ["src/migration/**/*.ts"],