通过 Nuke 为 Dotnet Core 应用构建自动化流程

localImages = new(); Target LoginDocker => _ => _

    .Executes(() =>
    {
        DockerLogin(_ => _
            .SetServer(RegistryUrl)
            .SetUsername("xxx")
            .SetPassword("xxxxx"));
    });

Target BuildDockerImages => _ => _

    .Executes(() =>
    {
        foreach (var project in Projects)
        {
            var tag = $"{ImagePrefix}{project.Name}:{GitVersion.FullSemVer}";
            localImages.Add(tag);
            DockerBuild(_ => _
                .SetProcessEnvironmentVariable("DOCKER_BUILDKIT", "1")
                .SetPath(“./”)
                .SetFile(project.Directory / "Dockerfile")
                .SetTag(tag));
        }
    });

Target PushImages => _ => _

    .DependsOn(BuildDockerImages)
    .DependsOn(LoginDocker)
    .Executes(() =>
    {
        foreach (var image in localImages)
        {
            DockerPush(_ =>
            _.SetName(image));
        }
    });

Target CleanImages => _ => _

    .DependsOn(PushImages)
    .Executes(() =>
    {
        foreach (var image in localImages)
        {
            DockerImageRm(s => s
            .SetImages(image)
            .SetForce(true));
        }
    });

Target RunDockerTasks => _ => _

    .DependsOn(CleanImages)
    .Executes(() =>
    {
        Serilog.Log.Information($"{ProjectName} 构建结束");
    });

} “`

调试

本地运行代码,既可以执行以上逻辑,以及调试;非常方便。

调用

通过 执行命令行:dotnet nuke RunDockerTasks 即可执行镜像的构建与推送,可以很方便的与gitlab、github、jenkins 等结合。

优化

  1. 执行以上CI,需要宿主机,安装Dotnet SDK,以实现 Dotnet tools 的安装,以及Docker 客户端的安装;可以考虑使用Docker In Docker的方式,减少对服务器的要求;

  2. 默认会对所有的项目进行构建并推送,可以结合 Parameter 的方式,按需指定需构建的项目;

  3. 可以使用compose 方式构建,隐藏项目细节;

    总结

    对于功能不复杂、脚本不熟悉、或者缺少运维的场景下,可以尝试使用。