在 GitHub 工作流中获取当前日期和时间

81

我有一个GitHub的工作流程,用于发布每夜构建版本。它使用create-release action。这是目前工作流文件的样子:

name: Release Nightly Snapshot

on:
  schedule:
  - cron: "0 0 * * *"

jobs:
  build:
    name: Release Nightly Snapshot
    runs-on: ubuntu-latest
    steps:
      - name: Checkout master Branch
        uses: actions/checkout@v2
        with:
          ref: 'master'
      - name: Create Release
        id: nightly-snapshot
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: 'nightly snapshot'
          release_name: 'nightly snapshot'
          draft: false
          prerelease: false

我希望tag_namerelease_name使用当前日期和时间,而不是硬编码的值。然而,我找不到任何相关文档。我该如何做?

6个回答

127

这篇文章中,您可以创建一个步骤,设置其输出为值$(date +'%Y-%m-%d')

然后使用${{ steps.date.outputs.date }}来使用此输出。以下是环境变量和输入的示例:

on: [push, pull_request]
name: build
jobs:
  build:
    name: Example
    runs-on: ubuntu-latest
    steps:
      - name: Get current date
        id: date
        run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
      - name: Test with environment variables
        run: echo $TAG_NAME - $RELEASE_NAME
        env:
          TAG_NAME: nightly-tag-${{ steps.date.outputs.date }}
          RELEASE_NAME: nightly-release-${{ steps.date.outputs.date }}
      - name: Test with input
        uses: actions/hello-world-docker-action@master
        with:
          who-to-greet: Mona-the-Octocat-${{ steps.date.outputs.date }}

输出:

* Test with environment variables
nightly-tag-2020-03-31 - nightly-release-2020-03-31

* Test with input
Hello Mona-the-Octocat-2020-03-31

2
虽然我不是专家,但我不明白这个怎么能行得通,因为它似乎混合了两个不同的概念。echo "{name}={value}" >> $GITHUB_ENV 用于设置环境变量,但你定义了一个 name 环境变量,而你的脚本从未使用过。${{ steps.<step_id>.outputs.<output_id> }} 用于读取步骤的输出,但你尝试读取 date 步骤从未写入的 date 输出。我建议改用:run: echo "::set-output name=today::$(date +'%Y-%m-%d')",然后使用 ${{ steps.date.outputs.today }} - Jean-Alexis Aufauvre
8
对我来说,通过 run: echo "MY_DATE=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV 这个新步骤,并在随后的步骤中使用 ${{ env.MY_DATE }} 成功了。如此回答所述 https://dev59.com/Sb3pa4cB1Zd3GeqPpf4w#64649397 。 - Faber
2
答案对我不起作用,但@Jean-AlexisAufauvre有效。 - JavierSegoviaCordoba
2
@Pete,你能提供一个证明set-output已经过时的来源吗?我找不到任何相关信息。 - Cas
1
此解决方案现已在 Github Actions 中弃用。 - luismesas
显示剩余2条评论

51

以下是通过环境变量实现的另一种方法(来源于此帖子):

name: deploy
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Set current date as env variable
        run: echo "NOW=$(date +'%Y-%m-%dT%H:%M:%S')" >> $GITHUB_ENV
      - name: Echo current date
        run: echo $NOW # Gives "2022-12-11T01:42:20"

这将日期设为环境变量,如果您想在后续步骤的脚本/程序中使用它,则非常有用。


6
很遗憾,“set-env”现在已经被弃用了:https://github.blog/changelog/2020-11-09-github-actions-removing-set-env-and-add-path-commands-on-november-16/ - Max
1
谢谢,我只是使用$(date +'%Y-%m-%dT%H:%M:%S')来设置预发布包的临时构建。例如:-p:PackageVersion=$(date +'%Y%m%d.%H%M%S')-preview。 - Atif Rehman
3
我认为现在的语法有所不同:echo "NOW=$(date +'%Y-%m-%dT%H:%M:%S')" >> $GITHUB_ENV - maxisam
使用 ${{ env.var_name }} 访问环境变量,https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-of-writing-an-environment-variable-to-github_env。 - Shubham

28
一个干净的解决方案是使用${{ github.event.repository.updated_at}},它非常接近当前的日期时间$(date +%Y%m%d%H%M) 格式为ISO 8601 例如2022-05-15T23:33:38Z
优点: - 不需要执行shell命令 - 可以直接从工作流中访问 - 允许与GitHub事件进行交叉引用
缺点: - 在相同的提交上重新构建时,序列号保持不变 - 严格的格式 - 无法在Act测试框架中使用 - 由于它不是一个存储库,所以在重试时值不会改变(感谢@FabrícioCeolin指出这一点)
参考资料:
Github 上下文
事件对象

2
另一个主要缺陷是,由于冒号的缘故,如果没有进一步格式化,这将无效作为标记名称。 - Salvage
1
我尝试过这个,但是我得到的是上一个更新的时间(而不是当前的时间,即Action运行的时间)。 - WoJ
1
我喜欢这个答案。请添加缺点:如果您重试作业,则序列号保持不变。 - Fabrício Ceolin
请注意:event.repository.updated_at字段似乎只在罕见的事件中更新,比如更改存储库的描述或主要语言(参见https://stackoverflow.com/a/15922637/299409)。这并不是常见的事件。它可能非常久远,并且不太可能与提交时间相同。 另一个选择是pushed_at,它是任何提交或分支的最后时间戳,但对于这个情况来说似乎也不正确。 相反,可以尝试使用github.event.head_commit.timestamp,因为它指的是当前更改的时间。 - undefined

5

更新

set-output 命令已被弃用,将很快被禁用。请升级使用环境文件。

文档可以在这里找到。

name: deploy
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Get current date
        id: date
        run: |
          echo "{date}={$(date +'%Y-%m-%d')}" >> $GITHUB_STATE
      - name: Test with environment variables
        run: echo $TAG_NAME - $RELEASE_NAME
        env:
          TAG_NAME: nightly-tag-${{ env.date }}
          RELEASE_NAME: nightly-release-${{ env.date }}

3
如果$GITHUB_ENV无法使用,请改用$GITHUB_OUTPUT
name: Flutter CI
run-name: ${{ github.actor }} is testing GitHub Actions 
on:
  push:
    tags:
      - '*'
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: "Set current date as env variable"
        run: |
          echo "builddate=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
        id: version  # this is used on variable path

      - name: Publishing Release
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ steps.version.outputs.builddate }}
          name: ${{ steps.version.outputs.builddate }}
          body: "your date"

      - name: print date
        run: |
          echo $DEBUG
        env:
          DEBUG: ${{ steps.version.outputs.builddate }}-DEBUG
          RELEASE: ${{  steps.version.outputs.builddate }}-RELEASE

2
# Set the date time
- name: Retrieve current Date Time in Singapore TimeZone
        shell: bash
        run: echo "START_TIME=$(TZ=":Asia/Singapore" date -R|sed 's/.....$//')" >> $GITHUB_ENV

# Fetch the date time as Github ENV variable
- name: print date
        run: echo ${{ env.START_TIME }}

输出-

Mon, 21 Aug 2023 15:34:24

**您可以根据需要更改时区


请查看维基百科上的TZ列表页面,以便完整。链接地址:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接