- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的团队正在创建将 Jenkins 管道转换为 Azure DevOps 管道的概念验证。我发现的挑战之一是使用 groovy 脚本,我们利用 Jenkins 内置变量来收集 checkin 的文件、删除的文件、Jenkins 节点名称等。我们希望不需要重新编码现有的 groovy脚本并回收我们已有的代码。有没有办法在 groovy 脚本中获取 azure 管道信息。
我尝试使用不同的措辞进行多次谷歌搜索,但无法找到任何关于使用 azure 管道变量的 java/groovy 的示例。
任何帮助将不胜感激。
下面您将找到我们当前用于 Jenkins 管道/构建定义的 groovy 脚本,这也是我们需要转换的内容。
import java.lang.*;
import java.io.Writer;
import jenkins.*;
import jenkins.model.*;
import hudson.*;
import hudson.model.*;
import hudson.util.*;
import hudson.scm.*;
import groovy.transform.Field;
import groovy.json.*;
def build = Thread.currentThread()?.executable;
println " ** CHANGESET ** ";
def changeSet = build.getChangeSet();
def items = changeSet.getItems();
def changedFilesPathsForDeploy = [];
def changedFilesPathsForUndeploy = [];
for(int i = 0 ; i < items.length; i++) {
gitChangeSet = items[i];
author = gitChangeSet.getAuthorName();
comment = gitChangeSet.getComment().replaceAll("\\n", " ");
rev = gitChangeSet.getRevision();
paths = gitChangeSet.getPaths();
println " ${ i + 1 }. ${ comment }";
println " Commit: ${ rev } (by ${ author }) ";
for(hudson.plugins.git.GitChangeSet.Path path : paths) {
editType = path.getEditType();
if(editType == hudson.scm.EditType.ADD || editType == hudson.scm.EditType.EDIT) {
changedFilesPathsForDeploy.add(path.getPath());
if (editType == hudson.scm.EditType.ADD) {
println " + ${ path.getPath() }";
} else {
println " M ${ path.getPath() }";
}
} else if(editType == hudson.scm.EditType.DELETE) {
println " - ${ path.getPath() }";
changedFilesPathsForUndeploy.add(path.getPath());
}
}
}
println "\n:> Creating deploy map";
def deployMap = JsonOutput.toJson(createChangesMap(changedFilesPathsForDeploy));
println ":> Creating undeploy map";
def undeployMap = JsonOutput.toJson(createChangesMap(changedFilesPathsForUndeploy));
buildJsonAssets(deployMap, undeployMap);
@Field def types = [
"classes" : "ApexClass",
"components" : "ApexComponent",
"pages" : "ApexPage",
"triggers" : "ApexTrigger",
"connectedApps" : "ConnectedApp",
"applications" : "CustomApplication",
"labels" : "CustomLabels",
"objects" : "CustomObject",
"tabs" : "CustomTab",
"flows" : "Flow",
"layouts" : "Layout",
"permissionsets" : "PermissionSet",
"profiles" : "Profile",
"remoteSiteSettings" : "RemoteSiteSetting",
"reports" : "Report",
"reportTypes" : "ReportType",
"staticresources" : "StaticResource",
"workflows" : "Workflow",
] as Map;
def createChangesMap(def affectedFiles) {
def fileNames = [];
def foldersAndFiles = [ LSApp: false ];
def flattenedFiles = affectedFiles.flatten();
flattenedFiles.each { it ->
def changes = it.split('/').collect { it as Object };
if (changes.first() == 'src') {
fileNames.add(changes);
} else if (changes.first() == 'LSApp') {
foldersAndFiles[ 'LSApp' ] = true;
}
}
def finalMap = retrieveFoldersAndFiles(fileNames, foldersAndFiles);
return finalMap;
}
def retrieveFoldersAndFiles(def pathLists, def foldersAndFiles) {
def folder;
pathLists.each { pathList ->
def filename = pathList.last().tokenize('.').first();
pathList.each { key ->
filename = key == 'objects' ? pathList.take(5).last() : filename;
if (types.containsKey(key)) {
folder = types[ key ];
if (foldersAndFiles.containsKey(folder)) {
foldersAndFiles[ folder ] = foldersAndFiles[ folder ] + filename;
} else {
foldersAndFiles[ folder ] = [ filename ] as Set;
}
}
}
}
return foldersAndFiles;
}
def buildJsonAssets(def deployJson, def undeployJson) {
try {
if(build.workspace.isRemote()){
channel = build.workspace.channel;
fpDeploy = new FilePath( channel, build.workspace.toString() + "/SFDX/partial_dep/configs/deploy.json" );
fpUndeploy = new FilePath( channel, build.workspace.toString() + "/SFDX/partial_dep/configs/undeploy.json" );
} else {
fpDeploy = new FilePath( new File(build.workspace.toString() + "/SFDX/partial_dep/configs/deploy.json") );
fpUndeploy = new FilePath( new File(build.workspace.toString() + "/SFDX/partial_dep/configs/undeploy.json") );
}
if(fpDeploy != null) {
println "\n:> Storing changes to DEPLOY.JSON";
fpDeploy.write(deployJson, null); //writing to file
}
if(fpUndeploy != null) {
println ":> Storing changes to UNDEPLOY.JSON";
fpUndeploy.write(undeployJson, null); //writing to file
}
} catch (IOException error) {
println "Unable to create file: ${error}"
}
}
最佳答案
Groovy 似乎支持 HTTP 开箱即用,所以你可以尝试 DevOps REST API在没有任何库的情况下使用 Groovy。
关于Azure DevOps Services Build REST API,请引用以下链接:
https://learn.microsoft.com/en-us/rest/api/azure/devops/build/?view=azure-devops-rest-5.1
关于如何在Groovy中使用REST API,可以引用这个案例:Groovy built-in REST/HTTP client? :
Native Groovy GET and POST
// GET
def get = new URL("https://httpbin.org/get").openConnection();
def getRC = get.getResponseCode();
println(getRC);
if(getRC.equals(200)) {
println(get.getInputStream().getText());
}
// POST
def post = new URL("https://httpbin.org/post").openConnection();
def message = '{"message":"this is a message"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
println(postRC);
if(postRC.equals(200)) {
println(post.getInputStream().getText());
}
关于azure - 在 groovy 脚本中访问 Azure 管道构建信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61918511/
我正在使用 Assets 管道来管理我的 Grails 3.0 应用程序的前端资源。但是,似乎没有创建 CoffeeScript 文件的源映射。有什么办法可以启用它吗? 我的 build.gradle
我有一个我想要的管道: 提供一些资源, 运行一些测试, 拆资源。 我希望第 3 步中的拆卸任务运行 不管 测试是否通过或失败,在第 2 步。据我所知 runAfter如果前一个任务成功,则只运行一个任
如果我运行以下命令: Measure-Command -Expression {gci -Path C:\ -Recurse -ea SilentlyContinue | where Extensio
我知道管道是一个特殊字符,我需要使用: Scanner input = new Scanner(System.in); String line = input.next
我再次遇到同样的问题,我有我的默认处理方式,但它一直困扰着我。 有没有更好的办法? 所以基本上我有一个运行的管道,在管道内做一些事情,并想从管道内返回一个键/值对。 我希望整个管道返回一个类型为 ps
我有三个环境:dev、hml 和 qa。 在我的管道中,根据分支,阶段有一个条件来检查它是否会运行: - stage: Project_Deploy_DEV condition: eq(varia
我有 Jenkins Jenkins ver. 2.82 正在运行并想在创建新作业时使用 Pipeline 功能。但我没有看到这个列为选项。我只能在自由式项目、maven 项目、外部项目和多配置之间进
在对上一个问题 (haskell-data-hashset-from-unordered-container-performance-for-large-sets) 进行一些观察时,我偶然发现了一个奇
我正在寻找有关如何使用管道将标准输出作为其他命令的参数传递的见解。 例如,考虑这种情况: ls | grep Hello grep 的结构遵循以下模式:grep SearchTerm PathOfFi
有没有办法不因声明性管道步骤而失败,而是显示警告?目前我正在通过添加 || exit 0 来规避它到 sh 命令行的末尾,所以它总是可以正常退出。 当前示例: sh 'vendor/bin/phpcs
我们正在从旧的 Jenkins 设置迁移到所有计划都是声明性 jenkinsfile 管道的新服务器……但是,通过使用管道,我们无法再手动清除工作区。我如何设置 Jenkins 以允许 手动点播清理工
我在 Python 中阅读了有关 Pipelines 和 GridSearchCV 的以下示例: http://www.davidsbatista.net/blog/2017/04/01/docume
我有一个这样的管道脚本: node('linux'){ stage('Setup'){ echo "Build Stage" } stage('Build'){ echo
我正在使用 bitbucket 管道进行培训 这是我的 bitbucket-pipelines.yml: image: php:7.2.9 pipelines: default:
我正在编写一个程序,其中输入文件被拆分为多个文件(Shamir 的 secret 共享方案)。 这是我想象的管道: 来源:使用 Conduit.Binary.sourceFile 从输入中读取 导管:
我创建了一个管道,它有一个应该只在开发分支上执行的阶段。该阶段还需要用户输入。即使我在不同的分支上,为什么它会卡在这些步骤的用户输入上?当我提供输入时,它们会被正确跳过。 stage('Deplo
我正在尝试学习管道功能(%>%)。 当试图从这行代码转换到另一行时,它不起作用。 ---- R代码--原版----- set.seed(1014) replicate(6,sample(1:8))
在 Jenkins Pipeline 中,如何将工件从以前的构建复制到当前构建? 即使之前的构建失败,我也想这样做。 最佳答案 Stuart Rowe 还在 Pipeline Authoring Si
我正在尝试使用 执行已定义的作业构建 使用 Jenkins 管道的方法。 这是一个简单的例子: build('jenkins-test-project-build', param1 : 'some-
当我使用 where 过滤器通过管道命令排除对象时,它没有给我正确的输出。 PS C:\Users\Administrator> $proall = Get-ADComputer -filter *
我是一名优秀的程序员,十分优秀!