【问题标题】:How to get SHA of commit for Xcode Bot "Run Script" Trigger? Updating status of tests on Github如何获取 Xcode Bot“运行脚本”触发器的提交 SHA?更新 Github 上的测试状态
【发布时间】:2015-04-21 15:24:41
【问题描述】:

我创建了一个 Xcode Bot,它在每次提交时都集成。

在“运行脚本”触发器中,我想使用已运行的测试的集成状态更新当前的 GitHub 提交。相当标准的 CI 东西。

然后我将运行如下脚本:

curl -i -X POST -H "Content-type: application/json"
-H 'Authorization: token TOKEN_HERE' -d 
'{
"state": "success",
"target_url": "https://example.com/build/status",
"description": "The build succeeded!",
"context": "continuous-integration/jenkins"
}' 
https://api.github.com/repos/ORGANIZATION_HERE/REPO_HERE/statuses/SHA_HERE

看起来我可以从 Xcode Bot 环境变量中获取 successfailure 状态:

Access build folder in Xcode Server CI bot run (env variables?)

但是,当前提交的 SHA 未列出。此时如何获取用于集成的提交的 SHA,以用于 GitHub 状态 API 请求?

【问题讨论】:

    标签: xcode git continuous-integration xcode-bots xcode-server


    【解决方案1】:

    我在我的 Xcode Bot 触发器中使用此代码来获取提交的 SHA:

    git -C ${XCS_SOURCE_DIR}/name_of_your_git_repo rev-parse HEAD
    

    这是获取分支名称:

    git -C ${XCS_SOURCE_DIR}/name_of_your_git_repo rev-parse --abbrev-ref HEAD
    

    这会在源目录中执行一个 git 命令,将“name_of_your_git_repo”替换为您在 git 上的存储库的名称

    【讨论】:

    【解决方案2】:

    XCS_OUTPUT_DIR 有一个名为sourceControl.log 的文件。该文件的日志如下:

    "DVTSourceControlLocationRevisionKey" : "3787c0d9e5107861a8b8d4c7300b2d414ad41dbb",
    

    您可以解析该日志以找到 SHA。

    也许更实际一点,CaveJohnson 可以拉取 SHA:

    PATH=/Library/Frameworks/Python.framework/Versions/3.4/bin:$PATH
    SHA=`cavejohnson getSha`
    

    或者它可以直接将 GitHub 状态设置为单行:

    #!/bin/bash
    PATH=/Library/Frameworks/Python.framework/Versions/3.4/bin:$PATH
    cavejohnson setGithubStatus
    

    值得注意的是,除了成功和失败之外,还有更多的状态,我知道至少有 6 个。你可以在我的Xcode 6 CI Missing Manual阅读更多关于它们的信息。

    【讨论】:

      【解决方案3】:

      在另一个答案中使用 cavejohnson 代码,它从 Xcode 日志中的某些键获取哈希,我遇到了 the returned hash was an outdated one from the last build 的问题。

      我现在改用 git rev-parse HEAD 来获取 CI 构建中实际使用的提交的哈希值。我已将此作为修订提交给cavejohnson

      使用get_sha() 检索 SHA-1 哈希:

      def get_sha():
          return get_repo_sha(get_git_directory())
      
      def get_git_directory():
          for subdir in os.listdir('.'):
              if is_git_directory(subdir):
                  return subdir
          assert False
      
      def is_git_directory(path = '.'):
          return subprocess.call(['git', '-C', path, 'status'], stderr=subprocess.STDOUT, stdout = open(os.devnull, 'w')) == 0    
      
      def get_repo_sha(repo):
          sha = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=repo).decode('ascii').strip()
          return sha
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        相关资源
        最近更新 更多