actions/attest-build-provenance
Gere atestados de origem de construção assinados para artefatos de fluxo de trabalho. Alimentado internamente pelo pacote @actions/attest.
Os atestados vinculam algum assunto (um artefato nomeado junto com seu resumo) a um predicado de origem de construção SLSA usando o formato in-toto.
Uma assinatura verificável é gerada para o atestado usando um certificado de assinatura emitido pela Sigstore de curta duração. Se o repositório que inicia o fluxo de trabalho do GitHub Actions for público, a instância de bem público do Sigstore será usada para gerar a assinatura de atestado. Se o repositório for privado/interno, ele usará a instância privada Sigstore do GitHub.
Depois que o atestado for criado e assinado, ele será carregado na API de atestados do GH e associado ao repositório a partir do qual o fluxo de trabalho foi iniciado.
Os atestados podem ser verificados usando o comando attestation
na CLI do GitHub.
Consulte Usando atestados de artefato para estabelecer a procedência de construções para obter mais informações sobre atestados de artefato.
Dentro do fluxo de trabalho do GitHub Actions que cria algum artefato que você gostaria de atestar:
Certifique-se de que as seguintes permissões estejam definidas:
permissions :
id-token : write
attestations : write
A permissão id-token
dá à ação a capacidade de cunhar o token OIDC necessário para solicitar um certificado de assinatura Sigstore. A permissão attestations
é necessária para persistir o atestado.
Adicione o seguinte ao seu fluxo de trabalho após a criação do artefato:
- uses : actions/attest-build-provenance@v1
with :
subject-path : ' '
O parâmetro subject-path
deve identificar o artefato para o qual você deseja gerar um atestado.
Veja action.yml
- uses : actions/attest-build-provenance@v1
with :
# Path to the artifact serving as the subject of the attestation. Must
# specify exactly one of "subject-path" or "subject-digest". May contain a
# glob pattern or list of paths (total subject count cannot exceed 2500).
subject-path :
# SHA256 digest of the subject for the attestation. Must be in the form
# "sha256:hex_digest" (e.g. "sha256:abc123..."). Must specify exactly one
# of "subject-path" or "subject-digest".
subject-digest :
# Subject name as it should appear in the attestation. Required unless
# "subject-path" is specified, in which case it will be inferred from the
# path.
subject-name :
# Whether to push the attestation to the image registry. Requires that the
# "subject-name" parameter specify the fully-qualified image name and that
# the "subject-digest" parameter be specified. Defaults to false.
push-to-registry :
# Whether to attach a list of generated attestations to the workflow run
# summary page. Defaults to true.
show-summary :
# The GitHub token used to make authenticated API requests. Default is
# ${{ github.token }}
github-token :
Nome | Descrição | Exemplo |
---|---|---|
bundle-path | Caminho absoluto para o arquivo que contém o atestado gerado | /tmp/attestation.jsonl |
Os atestados são salvos no formato de pacote Sigstore serializado JSON.
Se vários assuntos estiverem sendo atestados ao mesmo tempo, cada atestado será gravado no arquivo de saída em uma linha separada (usando o formato JSON Lines).
Não mais de 2.500 assuntos podem ser atestados ao mesmo tempo. Os assuntos serão processados em lotes de 50. Após o grupo inicial de 50, cada lote subsequente incorrerá em um atraso exponencialmente crescente (limitado a 1 minuto de atraso por lote) para evitar sobrecarregar a API de atestado.
Para o caso de uso básico, basta adicionar a ação attest-build-provenance
ao seu fluxo de trabalho e fornecer o caminho para o artefato para o qual você deseja gerar o atestado.
name : build-attest
on :
workflow_dispatch :
jobs :
build :
permissions :
id-token : write
contents : read
attestations : write
steps :
- name : Checkout
uses : actions/checkout@v4
- name : Build artifact
run : make my-app
- name : Attest
uses : actions/attest-build-provenance@v1
with :
subject-path : ' ${{ github.workspace }}/my-app '
Se você estiver gerando vários artefatos, poderá gerar um atestado de procedência para cada um usando um curinga na entrada subject-path
.
- uses : actions/attest-build-provenance@v1
with :
subject-path : ' dist/**/my-bin-* '
Para curingas suportados junto com comportamento e documentação, consulte @actions/glob que é usado internamente para procurar arquivos.
Como alternativa, você pode listar explicitamente vários assuntos com uma lista delimitada por vírgula ou por nova linha:
- uses : actions/attest-build-provenance@v1
with :
subject-path : ' dist/foo, dist/bar '
- uses : actions/attest-build-provenance@v1
with :
subject-path : |
dist/foo
dist/bar
Ao trabalhar com imagens de contêiner, você pode invocar a ação com as entradas subject-name
e subject-digest
.
Se você quiser publicar o atestado no registro do contêiner com a opção push-to-registry
, é importante que o subject-name
especifique o nome completo da imagem (por exemplo, "ghcr.io/user/app" ou "acme. azurecr.io/user/app"). NÃO inclua uma tag como parte do nome da imagem – a imagem específica que está sendo atestada é identificada pelo resumo fornecido.
Os pacotes configuráveis de atestado são armazenados no registro OCI de acordo com a especificação do pacote Cosign.
NOTA : Ao enviar para o Docker Hub, use "index.docker.io" como a parte do registro do nome da imagem.
name : build-attested-image
on :
push :
branches : [main]
jobs :
build :
runs-on : ubuntu-latest
permissions :
id-token : write
packages : write
contents : read
attestations : write
env :
REGISTRY : ghcr.io
IMAGE_NAME : ${{ github.repository }}
steps :
- name : Checkout
uses : actions/checkout@v4
- name : Login to GitHub Container Registry
uses : docker/login-action@v3
with :
registry : ${{ env.REGISTRY }}
username : ${{ github.actor }}
password : ${{ secrets.GITHUB_TOKEN }}
- name : Build and push image
id : push
uses : docker/[email protected]
with :
context : .
push : true
tags : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
- name : Attest
uses : actions/attest-build-provenance@v1
id : attest
with :
subject-name : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
subject-digest : ${{ steps.push.outputs.digest }}
push-to-registry : true