如何将Focused Build与外部DevOps API连接起来

152 阅读3分钟

简介

探索使用我们的DevOps工具创建多个场景的选项和可能性,可以使用现有的外部DevOps API将Focused Build与任何持续创新服务器相连。这篇博客探讨了SAP公开的API,在一个简单的Azure DevOps管道中使用它来展示如何使用这种连接的实际参考。你可以在官方的API业务中心找到使用该API的所有必要信息**。**在这里,你可以找到参考资料、响应模式以及测试这个API的绝佳选项,并且可以剪下7种不同场景的代码。

API%20Methods%20supported

支持的API方法

前提条件

  • SP08 ST-OST组件已安装在7.2.X系统上。SAP Solution Manager SP13系统上。
  • 已经完成了部署的集中构建要求的配置
  • SALM_FB服务已经激活。你可以使用SICF_INST来检查服务是否为绿色。
  • OData服务的系统别名/SALM/EXT_DEVOPS_INTEG_SRV必须存在。你可以使用/n/IWFND/MAINT_SERVICE事务来检查,并在必要时添加别名。注意:除非你有几个系统别名,否则不应该设置默认系统标志
  • 通过事务SEGW检查Odata界面,并点击图标'Open Project ',你可以输入/SALM/EXT_DEVOPS_INTEG作为项目输入

/n/IWFND/MAINT_SERVICE.%20System%20Alias%20for%20OData%20Service

/n/IWFND/MAINT_SERVICE。OData服务的系统别名

对这个API的访问是由SAP Solution Manager服务器的NetWeaver堆栈的Internet Communication Framework来保证的,需要一个服务用户。一个标准的角色SAP_OST_FB_DEVOPS_INT作为Focused Build SP08的一部分被交付。关于如何使用已交付的标准授权角色的更多信息,请参阅Focused Build安全指南。

方法论

为了创建这个实际的例子,我使用了我手头的工具;但是,请随意使用你自己的测试和CI/CD工具进行尝试。

  • SAP解决方案管理器
  • 邮递员
  • Azure DevOps

探索官方文档、了解资源和方法(GET、POST)、尝试它们并最终设计你的管道是很重要的。

首先,我使用SAP解决方案管理器的SAP网关来尝试这个API,这使我能够快速检查语法并熟悉响应。后来,我使用Postman来测试外部调用并评估属性,最后我建立了一个小型管道,与我在Focused Build中的工作项目进行交互。

API%20Reference%20from%20SAP%20API%20Hub

注意:你将需要一个已经创建的工作项目,这个API没有任何资源来创建工作项目。

用SAP网关测试

为了测试这个API,我开始使用/n/IWFND/GW_CLIENT事务的第一种GET方法。从文档中(可在SAP API Hub ->External DevOps API in Focused Build
Technical Guide.pdf),我知道端点的结构https://:/sap/opu/odata/SALM/EXT_DEVOPS_INTEG_SRV/WorkItemSet(guid=guid’’) and the different resources ?$expand=toWIActualRelease,toWIAttachment,toWIText,toWICategory.

WIguid是直接从应用程序中获取的。

WI%20GUID

工作项目的GUID

你可以在/nSMICM事务中检查正确的主机和端口,并尝试使用GET方法。

Example%20Response%20Body%20for%20GET%20using%20Gateway

使用网关GET的响应体示例

你可以继续检查任何POST例子,网关将为你管理CSRF和cookies。

Creating%20a%20new%20text%20of%20type%20%u201CS105%u201D%20%28Comment%29%20in%20the%20work%20item

在工作项目中创建一个类型为 "S105"(注释)的新文本

用POSTMAN测试

一旦在SAP网关中测试了API,我就用Postman来测试API的外部工具,不同的是在POST方法中必须获取CSRF令牌。因此,有必要用GET请求获取CSRF令牌,然后将其传递给POST请求。要在Postman中做到这一点,你应该在头中添加密钥x-csrf-token,其值为fetch。你可以阅读其他博客来更有效地管理CSRF,例如只需一次点击就可以测试需要CSRF令牌验证的SAP OData服务。

Fetch%20x-csrf-token

获取x-csrf-token

例如,要给你的工作项目添加一个文本,你应该使用下面的web服务端点。

https://:/sap/opu/odata/SALM/EXT_DEVOPS_INTEG_SRV/WorkItemSet(guid=guid’’)/toWIText

使用之前生成的额外头文件x-csrf-token和正文

{
   “textType”: “S105”,
   “textContent”: “This is a new message”
}

HTTP%20POST%20method%20as%20part%20of%20the%20API%20using%20Postman

HTTP POST方法是使用Postman的API的一部分

创建一个PIPELINE

现在我已经测试并理解了API,我准备创建我的管道。在这个例子中,我使用了Azure DevOps Pipelines。我创建了这个简单的代码来测试博客中提出的原则,我设计了两个阶段来明确显示不同的方法。

# Starter pipeline
# With this API, Work Items in Focused Build can be read,
# attachments and texts can be posted and the status of the Work Item can be changed.
# E0002	In Development; E0004	To Be Tested; E0009	Successfully Tested; E0010	Withdrawn; E0011	Preliminary Import Requested; E0012	Test for Preliminary Import; E0013	Tested for Production Import; E0014	Released for Production;# E0015	Handed Over to Release; E0016	Completed; E0017	To Be Corrected

trigger:
- main

pool:
  name: Default
 
stages:
    - stage: invokeGetResponse 
      jobs:
      - job: defineVariables 
        steps:       
        - powershell: |
            $headers = @{
            'Content-Type' = 'application/json'
            'Authorization' = 'Basic aTg0MTM5ODpvdHNlbnJlMjI='
            'x-csrf-token' = 'Fetch'
            }
            $uri = '$(Host)/WorkItemSet(guid=guid''$(WI)'')/toWIText'
            $response = Invoke-WebRequest $uri -Method Get -Headers $headers
            $token=  $response.Headers.'X-CSRF-TOKEN'
            $cookie = ($response.Headers.'Set-Cookie' -split ";" -split ",")[2]          
            echo "##vso[task.setvariable variable=CSRF_Token;isOutput=true]$token"
            echo "##vso[task.setvariable variable=Set_Cookie;isOutput=true]$cookie"
            Write-Output $response
            echo "The variables are created"           
          name: 'createToken'
          displayName: 'Generating Cookies & CSRF token'

    - stage: changeWIStatus
      jobs:
          - job: changingWIStatus
            variables:
              CSRF_Token: $[stageDependencies.invokeGetResponse.defineVariables.outputs['createToken.CSRF_Token']]
              Cookie: $[stageDependencies.invokeGetResponse.defineVariables.outputs['createToken.Set_Cookie']]
            steps:
            - script: |
                set cookie = $(Cookie)
                echo "here is the TOKEN" $(CSRF_Token)
                curl --request POST -v --url "$(Host)/ChangeStatus?userStatus='E0017'&guid=guid'$(WI)'" ^
                -H "Authorization: Basic aTg0MTM5ODpvdHNlbnJlMjI=" ^
                -H "Content-Type:application/json" ^
                -H "x-csrf-token: $(CSRF_Token)" ^
                -H "Cookie: %cookie%; sap-usercontext=sap-client=001"                
              displayName: 'Changing the WI Status'

如果你想重复使用这段代码,你应该定义这些变量。

  • $(HOST) – https://<myfbhost.com>:
  • $(WI) – WI GUID

请随时修改或改进这个例子!

结论

即使我们对这个API的方法有限,但在我们使用Focused Build的实施项目中,通过这个接口可以选择与CI/CD工具进行新的集成。作为一个例子,与gCTS的集成以加强持续集成看起来是一个机会领域;与SAP BTP的混合景观相结合是另一个例子,我们可以使用这种连接与我的需求到部署过程。希望这个简短的例子能够为你的敏捷之旅提供清晰的思路和新的想法。