小编flo*_*olu的帖子

Bazel - 在 Monorepo 中构建、推送、部署 Docker 容器到 Kubernetes

我有一个带有一些后端(Node.js)和前端(Angular)服务的 monorepo 。目前我的部署过程如下所示:

  1. 检查测试是否通过
  2. 为我的服务构建 docker 镜像
  3. 将 docker 镜像推送到容器注册表
  4. 将更改应用于Kubernetes集群(GKE)与kubectl

我的目标是在BazelCloud Build的帮助下自动化所有这些步骤。但我真的很难开始使用 Bazel:

为了使它工作,我可能需要为我自己的包/服务添加一个WORKSPACE包含外部依赖项的文件和多个BUILD文件?我需要实际实施方面的帮助:

  1. 如何使用 Bazel 构建我的 Dockerfiles?
  2. 如何将这些图像推送到注册表(最好是GCR)?
  3. 如何自动将更改应用到 Google Kubernetes Engine?
  4. 如何将此工具链与 Google Cloud Build 集成?

有关该项目的更多信息

我整理了一个小样本 monorepo来展示我的用例

结构

??? kubernetes
??? packages
?   ??? enums
?   ??? utils
??? services
    ??? gateway
Run Code Online (Sandbox Code Playgroud)

一般的

  • Gateway服务取决于enumsutils
  • 一切都是用打字稿写的
  • 每个服务/包都是一个 Node 模块
  • 文件夹Dockerfile里面有一个 …

docker kubernetes bazel monorepo google-cloud-build

7
推荐指数
1
解决办法
2618
查看次数

如何在 Node.Js 中将 Angular 组件渲染为 HTML(发送电子邮件)

假设我有一个简单的 Angular 组件:

@Component({
  selector: 'app-email-content',
  template: '<h1>Welcome {{username}}!</h1>'
})
export class WelcomeEmailComponent {
  @Input() username: string
}
Run Code Online (Sandbox Code Playgroud)

我的目标是使用这个 Angular 组件并使用 Node.Js 将其呈现为纯 HTML,以发送定制的电子邮件。

我知道使用Angular Universal绝对可以进行服务器端渲染。但我不确定如何显式呈现一个特定组件。

node.js typescript angular-universal angular

7
推荐指数
1
解决办法
1219
查看次数

如何在 NgRx createAction props&lt;&gt;() 中使用通用类型

我想创建一个 NgRx 动作创建器工厂。但我不知道如何将泛型类型传递给该props方法。

import { createAction, props } from "@ngrx/store";

function actionFactory<T>(name: string) {
  return createAction(name, props<T>());
//                          ^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

它抛出这个错误

Type 'Props<T>' provides no match for the signature '(...args: any[]): object'
Run Code Online (Sandbox Code Playgroud)

我需要如何修改工厂方法才能将泛型类型传递给props这样的方法?:

Type 'Props<T>' provides no match for the signature '(...args: any[]): object'
Run Code Online (Sandbox Code Playgroud)

你可以在Stackblitz上亲自尝试一下

typescript ngrx

7
推荐指数
1
解决办法
3989
查看次数

RXJS管道中未触发tap()

我必须做同样的事情,虽然我更喜欢第一个.但第一种方法似乎不起作用.(tap()未触发)

// does not work
this.actions$.pipe(
    ofType(LayoutActions.Types.CHANGE_THEME),
    takeUntil(this.destroyed$),
    tap(() => {
        console.log('test')
    }),
);
// works
this.actions$.ofType(LayoutActions.Types.CHANGE_THEME).subscribe(() => {
    console.log('test')
});
Run Code Online (Sandbox Code Playgroud)

reactive-programming rxjs ngrx angular

6
推荐指数
2
解决办法
2706
查看次数

Angular + Jest:无法解析AppComponent的所有参数:(?)

我在Typescript Monorepo内部操作。我想将带有Jest测试的Angular 8前端添加到Monorepo。但是我遇到了一些问题。

我在用

Angular CLI: 8.3.5
Run Code Online (Sandbox Code Playgroud)

我做了什么

我将使用此存储库作为起点!

1.创建Angular应用程序

然后在<root>/services我跑:

ng new frontend
Run Code Online (Sandbox Code Playgroud)

创建Angular应用程序后,我可以运行ng test以下结果:

ng测试默认

一切正常。

2.添加笑话

我正在使用https://github.com/briebug/jest-schematic轻松将Jest添加到我的Angular应用程序中

yarn global add @briebug/jest-schematic
ng add @briebug/jest-schematic
Run Code Online (Sandbox Code Playgroud)

这导致以下更改

变化

运行会jest导致以下错误:

$ jest
 FAIL  src/app/app.component.spec.ts
  ? Test suite failed to run

    File not found: <rootDir>/src/tsconfig.spec.json (resolved as: /home/flo/Desktop/stackoverflow-monorepo-angular-jest/services/frontend/src/tsconfig.spec.json)

      at ConfigSet.resolvePath (node_modules/ts-jest/dist/config/config-set.js:712:19)
      at ConfigSet.get (node_modules/ts-jest/dist/config/config-set.js:202:67)
      at ConfigSet.tsJest (node_modules/ts-jest/dist/util/memoize.js:43:24)
      at ConfigSet.get (node_modules/ts-jest/dist/config/config-set.js:297:41)
      at ConfigSet.versions (node_modules/ts-jest/dist/util/memoize.js:43:24)
      at ConfigSet.get (node_modules/ts-jest/dist/config/config-set.js:583:32)
      at ConfigSet.jsonValue (node_modules/ts-jest/dist/util/memoize.js:43:24)
      at ConfigSet.get [as cacheKey] …
Run Code Online (Sandbox Code Playgroud)

typescript jestjs monorepo angular angular8

6
推荐指数
1
解决办法
407
查看次数

Bazel k8s_object - 无法发布图像

我有这个 BUILD 文件:

package(default_visibility = ["//visibility:public"])

load("@npm_bazel_typescript//:index.bzl", "ts_library")
ts_library(
    name = "lib",
    srcs = glob(
        include = ["**/*.ts"],
        exclude = ["**/*.spec.ts"]
    ),
    deps = [
        "//packages/enums/src:lib",
        "//packages/hello/src:lib",
        "@npm//faker",
        "@npm//@types/faker",
        "@npm//express",
        "@npm//@types/express",
    ],
)

load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")
nodejs_image(
    name = "server",
    data = [":lib"],
    entry_point = ":index.ts",
)

load("@io_bazel_rules_docker//container:container.bzl", "container_push")
container_push(
   name = "push_server",
   image = ":server",
   format = "Docker",
   registry = "gcr.io",
   repository = "learning-bazel-monorepo/server",
   tag = "dev",
)

load("@io_bazel_rules_k8s//k8s:object.bzl", "k8s_object")
k8s_object(
  name = "k8s_deploy",
  kind = "deployment",
  namespace = "default", …
Run Code Online (Sandbox Code Playgroud)

kubernetes bazel

6
推荐指数
1
解决办法
325
查看次数

如何使用 Bazel 将 Angular 应用程序集成到 Monorepo 中?

过去几周我一直在构建一个 Typescript monorepo,它可以使用 Bazel 构建并部署到 Kubernetes。但最后一块拼图是集成一个 Angular 应用程序到整个工作流程中,我真的很纠结。

该项目

 ??? WORKSPACE
 ??? BUILD.bazel
 ??? package.json
 ??? packages
 ?   ??? package1
 ?   ??? package2
 ?   ??? package3
 ??? services
     ??? service1
     ??? service2
     ??? service3
+    ??? angular-app
Run Code Online (Sandbox Code Playgroud)
  • WORKSPACE 根目录下的文件
  • BUILD.bazel 根目录下的文件
  • package.json根中只有一个
  • 所有包/服务都是 Typescript 库
  • 服务依赖于包
  • 每个包/服务都有自己的BUILD.bazel文件

源代码

目标

最后,我希望能够k8s_object为 Angular 应用程序添加一个BUILD.bazel像这样的根文件:

 load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
 k8s_objects(
     name = "kubernetes_deployment",
     objects = [
         "//services/service1",
         "//services/service2",
         "//services/service3",
+        "//services/angular-app"
     ]
)
Run Code Online (Sandbox Code Playgroud)

它应该在我运行时将 Angular 应用程序部署到 …

bazel ngrx angular-universal monorepo angular

6
推荐指数
1
解决办法
1298
查看次数

如何使用 NodeJs aws-sdk 更改电子邮件发件人名称

我通过aws-sdkNodejs发送电子邮件,如下所示:

const params = {
    Destination: {
        ToAddresses: [... ],
    },
    Message: {
        Body: {
            Html: {
                Data: `...`,
                Charset: 'utf-8'
            },
        },
        Subject: {
            Data: `...`,
            Charset: 'utf-8'
        }
    },
    Source: 'support@mydomain.com',
    ReturnPath: 'support@mydomain.com',
};
awsConfig.ses.sendEmail(params, (err, data))
Run Code Online (Sandbox Code Playgroud)

收到的电子邮件在 Gmail 中如下所示: 收到电子邮件

但是,我想知道如何更改此名称:

目前support发件人名称是,因为发件人电子邮件是support@mydomain.com。但我希望它被GitHub下面的公司取代。

在此先感谢您的帮助!

email amazon-web-services node.js aws-sdk amazon-simple-email-service

5
推荐指数
1
解决办法
1204
查看次数

XMLHttpRequest.upload.onprogress不适用于HTTPS

问题

我有一个页面,用户可以上传文件的帮助下FormDataXMLHttpRequest。上传文件效果很好。但upload.onprogress只有工作时上传一个HTTP连接

HTTPS

HTTPS

HTTP

HTTP

我已经在Heroku和Amazon EC2实例上对此进行了测试。但是总是一样的:

  • 通过HTTP上传时显示进度
  • 通过HTTPS上传时,永远不会触发进度事件

Javascript(Angular 7)

const xhr = new XMLHttpRequest();
let progress = 0;


/** THIS EVENT IS NOT WORKING WITH HTTPS */
xhr.upload.onprogress = (event: ProgressEvent) => {
    if (event.lengthComputable) {
        progress = 100 * (event.loaded / event.total);
    }
};


xhr.responseType = 'json';
xhr.open('POST', `${API_URL}/${this.API_PATH}/upload`, true);
xhr.setRequestHeader('authorization', this.authService.getAuthToken());
xhr.send(payload);
xhr.onload = () => {
    observer.next(xhr.response);
    observer.complete();
};
Run Code Online (Sandbox Code Playgroud)

节点

const busboyBodyParser = require('busboy-body-parser');
app.use(busboyBodyParser())
Run Code Online (Sandbox Code Playgroud)
const …
Run Code Online (Sandbox Code Playgroud)

javascript https xmlhttprequest node.js busboy

5
推荐指数
2
解决办法
376
查看次数

在 Monorepo 中使用许多包构建条件云

动机

我想在Google Cloud BuildGoogle Kubernetes Engine的帮助下完全自动化许多服务的部署。这些服务位于monorepo 中,它有一个名为.services

所以我cloudbuild.yaml为每个服务创建了一个并创建了一个构建触发器。这样cloudbuild.yaml做:

  1. 运行测试
  2. 构建新版本的 Docker 镜像
  3. 推送新的 Docker 镜像
  4. 将更改应用到 Kubernetes 集群

问题

随着服务数量的增加,构建触发器的数量也会增加。也有越来越多的服务被构建,即使它们没有改变。

因此我想要一种机制,它只有一个构建触发器并自动确定需要重建哪些服务。

例子

假设我有一个具有此文件结构的 monorepo:

??? packages
?   ??? enums
?   ??? components
??? services
    ??? backend
    ??? frontend
    ??? admin-dashboard
Run Code Online (Sandbox Code Playgroud)

然后我对frontend服务进行了一些更改。由于frontendadmin-dashboard服务依赖于components包,因此需要重建多个服务:

  • 前端
  • 管理仪表板

不是后端!

我试过的

(1) 多个构建触发器

每个服务设置多个构建触发器。但是这些构建中有 80% 是多余的,因为代码中的大多数更改仅与个人服务相关。管理许多看起来几乎相同的构建触发器也越来越复杂。单个cloudbuild.yaml文件如下所示:

steps: …
Run Code Online (Sandbox Code Playgroud)

build-automation google-cloud-platform kubernetes monorepo google-cloud-build

5
推荐指数
1
解决办法
907
查看次数