신뢰할 수 있는 게시
crates.io 신뢰할 수 있는 게시를 사용하면 수명이 긴 crates.io API 토큰을 GitHub Actions 시크릿에 저장하지 않고도 GitHub Actions 워크플로에서 크레이트를 게시할 수 있습니다.
신뢰할 수 있는 게시는 Rust 프로젝트 크레이트를 게시할 때 권장되는 방법입니다.
이 페이지에서는 rust-lang/team 저장소를 사용하여 Rust 프로젝트 저장소에 신뢰할 수 있는 게시를 구성하는 방법을 설명하고, 가장 흔히 쓰이는 게시 패턴을 소개합니다.
저장소가 Rust GitHub 조직 아래에 호스팅되어 있지 않다면 rust-lang/team 저장소를 통해 신뢰할 수 있는 게시를 구성할 수 없습니다. 이 경우 crates.io 신뢰할 수 있는 게시 문서의 안내를 따르십시오.
1. 크레이트 소유권 설정
신뢰할 수 있는 게시로 관리하려는 크레이트를 rust-lang-owner 계정이 소유하고 있는지 확인하십시오. 소유하고 있지 않다면 해당 계정을 소유자로 초대한 뒤, #t-infra Zulip 채널에서 초대를 수락해 달라고 요청하십시오.
2. 팀 저장소 구성
crates.io 크레이트 관리 문서에 설명된 대로 저장소 TOML 파일에 [[crates-io]] 섹션을 추가하십시오.
publish-environment가 참조하는 환경도 정의되어 있는지 확인하십시오. 예를 들면 다음과 같습니다.
[environments.publish]
branches = ["main"]
[[crates-io]]
publish-environment = "publish"
...
환경 규칙
환경 규칙은 게시용 GitHub Actions 워크플로를 트리거하는 이벤트와 일치해야 합니다.
예를 들어 게시가 다음 이벤트로 트리거되는 경우:
on:
push:
tags: ["v*"]
환경도 동일한 태그 푸시에서 워크플로가 실행되도록 허용해야 합니다.
[environments.publish]
tags = ["v*"]
3. GitHub Actions 워크플로 작성
신뢰할 수 있는 게시를 통해 crates.io에 게시하는 모든 워크플로에는 다음이 필요합니다.
environment: <publish-environment>가 지정된 작업(job);- GitHub가 OIDC 토큰을 발급(이슈)할 수 있도록 해당 job에 설정한
permissions: id-token: write; - 이름이
rust-lang/team의publish-workflow와 일치하는 워크플로 파일.
다음 방법 중 하나를 사용하여 GitHub Actions로 크레이트를 게시할 수 있습니다.
3a. cargo를 사용하여 게시
crates-io-auth-action을 사용하고 워크플로에서 cargo publish를 직접 실행하려면 이 방법을 사용하십시오.
워크플로를 설정하고 액션을 사용하는 방법에 대한 자세한 내용은 crates.io 신뢰할 수 있는 게시 문서의 “GitHub Actions Setup” 섹션을 참조하십시오.
Rust 프로젝트 크레이트에서는 작업의 environment 필드가 필수이며, 이 값은 rust-lang/team 저장소의 publish-environment 필드와 일치해야 합니다.
예를 들면 다음과 같습니다.
jobs:
publish:
environment: publish
...
이 GitHub 검색을 사용하면 Rust 프로젝트 저장소에서 이 방식의 예시를 찾을 수 있습니다.
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
이 워크플로는 다음과 같은 다른 GitHub 이벤트로도 트리거할 수 있다는 점에 유의하십시오.
- 릴리스 시:
on: release: types: [created] - workflow dispatch를 사용한 수동 실행:
on: workflow_dispatch:
3b. 기본 브랜치에서 release-plz로 릴리스하기
더 많은 자동화를 원한다면 워크플로에서 cargo publish를 직접 실행하는 대신 릴리스 자동화 도구인 release-plz를 살펴보십시오.
이 GitHub 검색을 사용하면 Rust 프로젝트 저장소에서 release-plz의 사용 예시를 찾을 수 있습니다.