我怎么能得到分支名称连接到github动作管道的标签?



我正在尝试使用github动作构建docker映像,如果标记提交发生,如果在staging上推送或拉取请求,则会触发;主要分支。我还使用了customize来根据提交定制遗留清单。但是我有一个问题,每次我试图标记一个提交来触发管道,它在提交定制的部分失败。错误提示

Run ad-m/github-push-action@master
Push to branch refs/tags/v0.3.8
To https://github.com/ahmedappout08/robo-demo.git
! [rejected]        HEAD -> v0.3.8 (already exists)
error: failed to push some refs to 'https://github.com/ahmedappout08/robo-demo.git'
hint: Updates were rejected because the tag already exists in the remote.
Error: Invalid exit code: 1
at ChildProcess.<anonymous> (/home/runner/work/_actions/ad-m/github-push-action/master/start.js:29:21)
at ChildProcess.emit (events.js:210:5)
at maybeClose (internal/child_process.js:1021:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5) {
code: 1
}
Error: Invalid exit code: 1
at ChildProcess.<anonymous> (/home/runner/work/_actions/ad-m/github-push-action/master/start.js:29:21)
at ChildProcess.emit (events.js:210:5)
at maybeClose (internal/child_process.js:1021:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5)

这是Ci。yaml文件:

name: Docker
on:

push:
branches:
- main
- staging
tags:
- v*
pull_request:
branches:
- main
- staging
env:
# TODO: Change variable to your image's name.
IMAGE_NAME: robo-demo 
jobs:
# Run tests.
# See also https://docs.docker.com/docker-hub/builds/automated-testing/
# Push image to GitHub Packages.
# See also https://docs.docker.com/docker-hub/builds/
push:
# Ensure test job passes before pushing image.
runs-on: ubuntu-latest

steps:
- name: Checkout master
uses: actions/checkout@main

- name: Build image
run: docker build . --file Dockerfile --tag $IMAGE_NAME
- name: Log into registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin

- name: Push image tag
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }} == false
run: |
IMAGE_ID=docker.pkg.github.com/${{ github.repository }}/$IMAGE_NAME
# Change all uppercase to lowercase
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
# Strip git ref prefix from version
#VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/(.*),1,')
VERSION=$GITHUB_SHA
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
# Use Docker `latest` tag convention
echo IMAGE_ID=$IMAGE_ID
#echo VERSION=${GITHUB_REF##*/}
echo VERSION=$GITHUB_SHA
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
docker push $IMAGE_ID:$VERSION
- name: push image main & staging
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }}
run: |
IMAGE_ID=docker.pkg.github.com/${{ github.repository }}/$IMAGE_NAME
# Change all uppercase to lowercase
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/(.*),1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
# Use Docker `latest` tag convention
echo IMAGE_ID=$IMAGE_ID
echo VERSION=${GITHUB_REF##*/}
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
docker push $IMAGE_ID:$VERSION
- name: congrats
run: |
echo "Image Built on Branch" ${GITHUB_REF##*/}
- name: Setup Kustomize
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }} == false
uses: imranismail/setup-kustomize@v1
with:
kustomize-version: "3.6.1"
- name: Update Kubernetes resources
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }} == false
run: |
cd k8s-deployment/feature-version
kustomize edit set image robo-image=docker.pkg.github.com/${{ github.repository }}/$IMAGE_NAME:$GITHUB_SHA
cat kustomization.yaml
- name: Commit files
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }} == false
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action" 
git commit -am "Bump docker tag"
- name: Push changes
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging' }} == false
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }} 

我不知道如何修复将提交推到连接到标签的分支本身,因为我需要更新自定义。每个建筑后面都有Yaml

我不知道如何修复将提交推到连接到标签的分支本身,因为我需要更新自定义。每个建筑后面都有Yaml

就Git本身而言,分支名称和标签名称之间没有联系。

在Git级别,any名称-任何引用-只是一个存储哈希ID的名称。特别是分支名称被限制只能存储提交哈希ID,而标签名称可以存储任何内部Git对象的哈希ID。如果一个标签存储一个提交哈希ID,那么它被称为轻量级标签;如果一个标签存储一个标签对象的哈希ID,那么它被称为注释标签。这个标签对象通常存储一些提交的哈希ID。

您可以使用git branch --points-at查找选择某些特定提交的分支名称,使用git tag --points-at查找选择某些特定提交的标记名称。请参考git branchgit tag的文档

注意,您可以在这里为git tag提供commit哈希ID,它仍然可以找到带注释的标记。从技术上讲,无论您是命名标记对象本身,还是命名它的目标提交,它都会找到带注释的标记:

$ git rev-parse v2.3.0
42de6ed0c4c5c2a184b25ffeb4936af8226ccad1
$ git rev-parse v2.3.0^{commit}
9874fca7122563e28d699a911404fc49d2a24f1c
$ git tag --points-at 42de6ed0c4c5c2a184b25ffeb4936af8226ccad1
v2.3.0
$ git tag --points-at 9874fca7122563e28d699a911404fc49d2a24f1c
v2.3.0

但是,如果您试图查找哪个分支名称(可能没有,也可能有很多),请通过标记识别某些特定的提交,在运行git branch --points-at之前,您肯定需要首先将标记名称解析为提交哈希ID。

不管这些,你的总体计划在我看来似乎是毫无根据的。请记住,标记名称的目的是始终标识一个特定的提交。原始哈希ID也可以做到这一点,但是标记名提供了原始哈希ID没有的两个重要特性:
  • 它至少可能是人类可读的,并且可以具有语义,例如semver部分。

  • 它使您能够签署提交,而无需实际签署每个提交。也就是说,您可以为标记的提交提供GPG或其他数字签名,而不必在每次提交上都使用GPG或其他数字签名(在大多数情况下,这是弊大于利的:仅对标签进行签名,虽然在某种意义上不太安全,但却更有用,获得有效安全性的关键是平衡痛苦级别和完成工作级别,以便人们真正使用它)。

同时,分支名称的目的是允许某些东西-人类,计算机或有时两者-找到一些特定的但可变的提交。因此,我们为一些提交链的tip commit分配一个分支名称,表示这是迄今为止我们最好的提交。然后,当我们改进时,我们向链中添加新的提交,并移动分支名称

对于正式的发布过程来说,这意味着您不会标记一个候选发布,除非它面向更广泛的受众。您可以用分支名称标记这个发布候选版本。然后您将构建它并测试它,如果它通过了内部测试,您可能会然后将其标记为发布候选,也许在更新某种构建定制之后

换句话说,您永远不会自定义标记的版本。您总是从分支进行定制—可能是一个特定的分支模式,但是是一个分支。然后,您可以标记定制版本,前提是它已准备好候选。如果它足够好,就会被授权发布或"广泛发布"。经过签名和验证(以便组织外部的人可以看到它是受信任的,以及由谁信任的)。当然,无论谁添加签名,都应该确保信任链——每一步进行的验证——是有效的、不间断的。

最新更新