如何使用Azure DevOps构建docker,并将其推送到ARTIFACTORY

Swarnendu Kayal
2023-01-22 11:06

这篇KB文章的目的是用一个简单的用例开始Azure DevOps构建过程。

简介

Azure DevOps是一个CI/CD工具,通过它我们可以构建多种包类型。在这篇KB文章中,我们将讨论docker构建。docker构建有四个步骤

  1. 使用docker注册表提取docker映像。在这种情况下,它是Artifactory。
  2. 使用我们提取的映像构建一个docker映像。
  3. 将图像推送到Artifactory并发布构建信息。
  4. 使用JFrog x射线扫描构建

以下步骤:

  1. 创建Dockerfile并上传到GitHub存储库。示例Docker文件如下所示
ARG BASEIMAGE

从BASEIMAGE美元

#从nginx

执行echo $BASEIMAGE命令

执行命令rm /etc/nginx/conf.d/*

删除文件

添加helloworld.conf /etc/nginx/conf.d/

添加index.html /usr/share/nginx/html/

添加artii -error.txt /usr/share/nginx/html/
这是一个简单的docker文件,它只是把基本映像作为一个参数,它将作为Azure DevOps任务的一部分被提取。然后删除现有文件,然后将“helloworld.conf”、“index.html”和“artii -error.txt”文件添加到新映像下的特定目录中。这些文件也需要被推送到上传Dockerfile的同一个GitHub存储库。

(注:上面提到的文件可以是任何文件。我们的目的是把一些文件放到我们已经拉出的nginx图像中,并创建一个新图像,我们将把它推到Artifactory)

2.在Azure DevOps中创建一个组织,如下所示

用户添加图片

用户添加图片

3.创建组织后,安装Artifactory-Azure DevOps插件-您需要到市场安装插件,如下面的截图所示-

用户添加图片

用户添加图片

4.现在通过点击“新建项目”按钮创建一个新项目,如图截图所示

用户添加图片

并通过给出详细信息来创建项目

用户添加图片

5.现在是时候创建管道了。请查看下面的截图-

用户添加图片

它会要求你选择Dockerfile的位置,基本上就是源代码。选择GitHub作为源代码提供者,然后选择存储库名称。完成身份验证后,它将创建一个基本模板。

6.我们需要创建Artifactory连接和docker注册表,如下所示。这些将用于用Artifactory验证Azure DevOps,以及在任务中使用的docker注册表。它的创建方式如下-

用户添加图片
用户添加图片

艺术服务连接-

用户添加图片

用户添加图片

注意:请将您实例的URL配置为“https:/// Artifactory”。

Docker连接-

用户添加图片

用户添加图片

7.现在是时候创建管道了。我们将定义如下所示的一些变量,我们将在我们要创建的任务中使用这些变量-
参数:
—name: prodName
displayName:要构建的产品
类型:字符串
默认值:nginx的
—name:注册表
displayName:注册表主机名
类型:字符串
默认值:test.jfrog.io”
—name: targetRepo
displayName:要推送到的目标回购
类型:字符串
默认值:“k-docker”

变量:
prodName: ${{参数。prodName}}
注册表:${{parameters。注册表}}
targetRepo: ${{parameters。targetRepo}}
buildContext:“测试- $ (prodName)”
imageNameTb:“(注册中心)/美元(targetRepo) /测试- $ (prodName) '
imageNameBase:“(注册中心)/ (targetRepo) /美元$ (prodName) '

8.我们有四个任务

A. Artifactory工具安装程序-创建如下-
用户添加图片

选中“install Custom version”复选框后,您可以安装特定版本的JFrog CLI。默认情况下,将选择最新版本。但是,请确保您在Artifactory中创建了存储库“cli”,如下所示-

用户添加图片

B.然后添加抽取docker base image的任务。这个任务来自于Artifactory-Azure DevOps插件

用户添加图片

在这里,我们可以定义特定的图像名称,如“Nginx”。但是,我们已经在上面定义了图像的变量“imageNameBase”。所以我们在这里用它。基本上,我们希望将图像拉为“arturl/k-docker/nginx”,并从上面定义的“imageNameBase”变量中创建如上所述的图像。

C.为docker构建定义任务。这是Azure DevOps附带的默认任务。Artifactory - Azure DevOps插件没有docker构建选项。所以我们用默认的docker任务-来构建它

用户添加图片

如您所见,“构建上下文”保持空白。因此,当生成相关代码时,将会有一个名为“buildContext”的属性,该属性将为空白。我们可以从生成的代码中删除该属性。

该任务将从GitHub页面中选择Dockerfile,然后构建新的docker映像

D.现在构建了docker映像。您将能够在Azure DevOps任务日志中看到任务的日志,如下所示-

成功构建acb00a56ee2e
成功标记test.jfrog.io/k-docker/test-nginx:20220517.2

现在,我们将使用如下所示的任务将这个新创建的映像推到Artifactory存储库-

用户添加图片
这将把映像推到docker存储库并创建一个build-info。Json文件,包含所有构建相关的信息和作为docker构建的一部分所需的依赖关系以及所有环境变量。

E.现在我们需要按build-info。json”文件被创建到Artifactory,这将注册这作为一个构建在Artifactory。具体任务如下-

用户添加图片

F.在此之后,我们必须使用JFrog x射线扫描构建。任务定义如下-

用户添加图片

在使用x射线扫描步骤触发构建之前,请确保拥有以下检查表
1.在运行管道之前创建一个监视和策略。否则,使用Azure DevOps任务的x射线扫描将无法成功。请按照以下链接创建手表和策略-
使用此链接创建策略和规则//www.si-fil.com/confluence/display/JFROG/Creating+Xray+Policies+and+Rules

使用此链接创建手表并添加存储库、构建、策略和规则//www.si-fil.com/confluence/display/JFROG/Configuring+Xray+Watches

2.确保在创建策略时在策略的规则中启用以下选项-

用户添加图片

3.需要在JFrog平台的索引资源中包含构建。2022世界杯阿根廷预选赛赛程但是,当第一次使用x射线扫描任务创建构建时,它将跳过x射线扫描步骤,因为构建未包含在索引资源中。2022世界杯阿根廷预选赛赛程这就是为什么建议使用include或Exclude模式来包含构建。对于本例,Include模式是“*/**”。这意味着平台将把所有推送到Artifactory的构建添加到索引资源中2022世界杯阿根廷预选赛赛程

用户添加图片

有关索引资源的更多详细信息,也建议阅读这篇KB文章-2022世界杯阿根廷预选赛赛程//www.si-fil.com/knowledge-base/xray-how-to-index-and-scan-all-builds-in-xray-in-the-unified-platform/

保存以上任务后,“azure-pipelines.”yaml”文件将被保存到同一个存储库中,Dockerfile和其他文件将在GitHub中推送,构建将在后台触发。生成的代码和定义的变量如下所示
触发:
——主
池:
vmImage: ubuntu-latest
参数:
—name: prodName
displayName:要构建的产品
类型:字符串
默认值:nginx的
—name:注册表
displayName:注册表主机名
类型:字符串
默认值:test.jfrog.io”
—name: targetRepo
displayName:要推送到的目标回购
类型:字符串
默认值:“k-docker”

变量:
prodName: ${{参数。prodName}}
注册表:${{parameters。注册表}}
targetRepo: ${{parameters。targetRepo}}
buildContext:“测试- $ (prodName)”
imageNameTb:“(注册中心)/美元(targetRepo) /测试- $ (prodName) '
imageNameBase:“(注册中心)/ (targetRepo) /美元$ (prodName) '

步骤:
-任务:ArtifactoryToolsInstaller@1
displayName: 'Install Build deps'
输入:
artifactoryService:“kayal-art”
cliInstallationRepo:“cli”

-任务:ArtifactoryDocker@1
displayName: '提取图像'
输入:
命令:“拉”
artifactoryService:“kayal-art”
sourceRepo:“k-docker”
imageName:“$ (imageNameBase) '

-任务:Docker@2
displayName: '生成图像'
输入:
containerRegistry:“ArtDocker”
库:“(targetRepo) /美元(buildContext) '
命令:“构建”
Dockerfile:“(Build.SourcesDirectory) / Dockerfile美元”
参数:'——build-arg BASEIMAGE=$(imageNameBase)'
标签:|
$ (Build.BuildNumber)

-任务:ArtifactoryDocker@1
displayName: 'Push Image'
输入:
命令:“推”
artifactoryService:“kayal-art”
targetRepo:“k-docker”
imageName:“(imageNameTb):美元(Build.BuildNumber) '
collectBuildInfo:真
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '
includeEnvVars:真

-任务:ArtifactoryPublishBuildInfo@1
displayName: '发布构建信息'
输入:
artifactoryService:“kayal-art”
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '

-任务:ArtifactoryXrayScan@1
displayName: ' x射线扫描'
输入:
artifactoryService:“kayal-art”
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '
allowFailBuild:真
“displayNames”是手动添加的,因为它们不是由任务生成的。这将显示任务的显示名称。如果没有定义,它将显示任务的名称为Display names -

用户添加图片

请注意,Azure DevOps插件在后台运行JFrog CLI。所以基本上,我们在这里所做的步骤,除了docker构建步骤之外,我们遵循的步骤是在这个博客中提到的-//www.si-fil.com/blog/manage-your-docker-builds-with-jfrog-cli-in-5-easy-steps/