BitBucket 管道:在 microsoft/dotnet:sdk 图像上为 Gulp 添加 NodeJS

BitBucket Pipeline: Adding NodeJS for Gulp on the microsoft/dotnet:sdk image

我有一个 ASP.NET 核心应用程序。它使用 Gulp 将 Sass 转换为 CSS 等。我已经修改了我的 .csproj 文件,使 Gulp 任务 运行 在 publish 之前。这是为了确保我的所有 JS 和 CSS 都在工件中。

<Target Name="PrePublishScript" BeforeTargets="PrepareForPublish">
  <Exec Command="npm install" />
  <Exec Command="gulp" />
</Target>

这是我的 BitBucket 管道文件:

pipelines:
  branches:
    master:
      - step:
          name: Build
          image: microsoft/dotnet:sdk
          caches:
            - dotnetcore
          script:
            - export PROJECT_NAME=YeGods.sln
            - dotnet restore
            - dotnet build $PROJECT_NAME
            - dotnet publish $PROJECT_NAME --configuration Release --output dist --verbosity minimal
          artifacts:
            - YeGods.Web/dist/**
      - step:
          name: Deploy
          image: alpine:3.8
          script:
            - apk add --update openssh
            - ssh deploy@$SERVER_HOST 'bash -s' < $BITBUCKET_CLONE_DIR/pre-deploy-script.sh
            - scp -r YeGods.Web/dist/* deploy@$SERVER_HOST:$SERVER_PATH_TO_SITE_DIRECTORY
            - ssh deploy@$SERVER_HOST 'bash -s' < $BITBUCKET_CLONE_DIR/post-deploy-script.sh

这目前失败了,因为 npm install 脚本调用失败,因为 microsoft/dotnet:sdk 图像中没有安装 NodeJS。我怀疑我所要做的就是在 - export PROJECT_NAME=YeGods.sln 之前的另一个脚本调用中安装 NodeJS。所以我添加了 apt-get install nodejs 但这没有用。它说找不到 nodejs.

如果哪种思路是正确的,那么将 NodeJS 安装到 microsoft/dotnet:sdk 图像上的正确方法是什么?

I have an article on this exact issue,这里是总结:

解决方案 1:

您需要一个同时安装了 dotnet 和节点的 docker 映像。这可以通过安装 nodejs 扩展来自微软的官方 dotnet 图像来轻松完成。但是您确实需要知道如何使用 docker。

这可能是学习 docker 的好机会,如果您还没有,网上有很多教程。

我之前这样做过,并将我的 docker 图片上传到 docker 中心,以便 Pipelines 可以使用它。它在 dockerhub 上公开可用,但你真的不应该使用不信任的人的图像,但如果你仍想测试,请将 image: microsoft/dotnet:sdk 更改为 image:peterekepeter/dotnet-node-sdk:latest

这是一个 Dockerfile 示例,说明如何获取 dotnet 映像并在其上安装 nodejs:

FROM microsoft/dotnet:2-sdk

# install nodejs for building & testing frontend

RUN curl -sL https://deb.nodesource.com/setup_10.x  | bash -
RUN apt-get -y install nodejs
RUN node -v

解决方案 2:

在安装了 nodejs 的 docker 图像上将前端构建分离到单独的管道步骤和 运行 gulp 任务。如果您在这两个步骤之间建立了依赖关系,请使用工件持久化它们。

但要使其正常工作,您需要修改构建脚本,从 csproj 项目中删除 gulp 命令,并将它们 运行 作为管道脚本的一部分。

这是一个如何执行此操作的示例:

pipelines:
  default:
    - step:
        name: .NET Core build & test
        image: microsoft/dotnet:2-sdk
        caches:
          - dotnetcore
        script:
          - dotnet restore
          - dotnet build --no-restore
          - dotnet test --no-build --no-restore
    - step:
        name: Frontend build & test
        image: node:6.9.4
        caches:
         - node
        script:
         - npm install
         - npm run build
         - npm run test