제출 로그에서 확장 가능한 태그로 GiitHub Actions 붙여넣기
23793 단어 GitHubGitHub ActionsCI/CDtech
개시하다
CHANGELOGlerna-changelog를 사용합니다.요청에서md를 생성할 수 있습니다.
CHANGELOG.md를 생성할 때 변경 로그의 분류와 제목이 적합하지 않은 것을 발견하면 수정 요청을 통해 대응할 수 있습니다.
이것은 디버그 로그를 사용하는 방법보다 더 유연하다.한편, Conventional Commits 등 방법에 따라 적당한 제출 로그를 활용하면 제출 요청에 같은 내용의 라벨을 붙이는 데 두 번의 번거로움이 발생한다.이는 GiitHub Actions의 CI/CD에 시간을 들여 자동으로 표시하는 것으로 해결됩니다.
다음은lerna-change elog과 GiitHub Actions의 제출 로그의 자동 표시를 소개합니다.
해결하고 싶은 과제
본문의 전제
lerna-change elog으로 댓글에서 발표 노트 생성 기사 환경
작업 환경
이 글은 다음과 같은 환경에서 동작을 확인했다.
재설정 요청의 레이블 정의
lerna-change elog에서도 요청에 추가된 탭을 사용합니다.package.json에서 GiitHub 창고에 대한 탭을 설정합니다.
로그를 제출하는 Prefix에도 이 패키지가 있습니다.json이 정의한 키 'Type:' 이외의 'Feature' 등 문자열을 사용하여 소문자로 변환하는 것'feature '등을 사용합니다.커밋 로그를 Conventional Commiits 등과 일치시키려면 태그의 문자열로 사용합니다.
※ 완전히 일치할 필요는 없고, GiitHub Action 스크립트로 일치할 수만 있다면 문제 없습니다
이번에는 다음과 같이 GiitHub의 창고태그 만들기를 정의했다.
package.json
{
"...": "省略",
"changelog": {
"labels": {
"Type: Breaking": "💥 Breaking Change",
"Type: Feature": "🎉 New Feature",
"Type: Enhancement": "🚀 Enhancement",
"Type: BugFix": "💉 Bug Fix",
"Type: Deprecated": "⚠️ Deprecated",
"Type: Docs": "📝 Documentation",
"Type: Refactoring": "✨ Refactoring",
"Type: Testing": "✅ Testing",
"Type: Build": "🛠️ Build",
"Type: Dependency": "📦 Dependency"
}
}
}
레이블 작업 설정
Actions 가 요청에 레이블을 붙여 넣기 때문에
pull_request
이벤트를 트리거합니다.제작할 때 주셨으면 좋겠어요
types: [ opened ]
.※ 후술 라벨 검사에서
type
증가if
하므로opened
on:
pull_request:
types: [ opened ]
jobs:
add_labels:
if: github.event.action == 'opened'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/github-[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const ret = await github.issues.listLabelsForRepo({
owner: context.repo.owner,
repo: context.repo.repo
});
const definitions = ret.data
.filter(value => value.name
.includes(': '))
.map(value => value.name.split(':')[1].toLowerCase().trim());
const commits = await github.pulls.listCommits({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number
});
const chunk = Array.from(new Set(commits.data
.map(data => data.commit.message)
.filter(msg => msg.includes(': '))
.map(msg => msg.startsWith('chore: release') ? msg : msg.split(': ')[0])));
const prefixes = chunk.map(value => {
if (value === 'fix') { return 'bugfix'; }
if (value.startsWith('chore(deps')) { return 'dependency'; }
if (value.startsWith('chore: release')) { return 'release'; }
return value;
}).filter(value => 4 <= value.length);
const labels = definitions
.filter(definition => prefixes.filter(prefix => definition.startsWith(prefix)).length !== 0)
.map(value => `type: ${value}`);
if (labels && labels.length !== 0) {
github.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels
});
}
창고에 정의된 모든 라벨을 먼저 가져옵니다.모든 탭에서 이번 정의의 탭을 선별하고, 탭을 소문자로만 서명하여 정의 목록을 만듭니다.
e.g. "Type:Feature"등 이번 정의의 모든 라벨을 얻어 "feature"목록을 작성합니다
다음에 우리는 요청에 대한 모든 제출을 받을 것이다.
제출한 편지에서 Prefix를 꺼내 임시 목록을 만듭니다.
"feat:send mail when status change"등 로그에서 "feat"같은 목록을 만듭니다
그런 다음 커밋된 메시지 Prefix의 임시 목록을 태그와 일치하는 Prefix로 변환합니다.
커밋된 메시지와 태그가 일치하지 않는 내용을 태그 문자열에 맞게 조정합니다.
마지막으로, 제출한 편지에서 변환된 탭 목록과 창고에서 가져온 탭 정의 목록에서 일치하는 탭을 집합 요청 탭으로 설정합니다.
태그 작업 확인
요청에 자동으로 태그를 추가할 수 있지만, 메시지를 보내는 Prefix가 Action 처리와 일치하지 않으면 태그가 없습니다.
lerna-change elog을 사용하려면 적당한 라벨을 붙여야 한다.따라서 요청에 레이블이 설정되지 않은 경우 잘못된 GiitHub Actions도 설정됩니다.
인용 요청 이벤트에서 요청 자체를 끌어당기는 작업과 탭의 작업에 반응하기 위해
types: [ opened, synchronize, reopened, labeled, unlabeled ]
.또한 탭 추가 작업이 끝난 후 추가하기 전에 오류needs: [ add_labels ]
가 반환되지 않기 때문에 오류가 있어도 검사if: always()
해야 한다.on:
pull_request:
types: [ opened, synchronize, reopened, labeled, unlabeled ]
jobs:
check_labels:
needs: [ add_labels ]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/[email protected]
- uses: actions/github-[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { changelog } = require('./package.json');
const ret = await github.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
const labels = new Set(ret.data.map(label => label.name));
const definitions = new Set(Object.keys(changelog.labels));
if (ret.data.length === 0 || new Set([...labels].filter(label => (definitions.has(label)))).size === 0) {
let body = '### Labels for Release Note\n'
body += '**[ERROR]** \n';
body += '- リリースノートの自動生成のためにラベルを付けてください。\n\n';
body += 'The available labels are as follows:\n'
body += '| Label | Release Note | | Label | Release Note |\n'
body += '|:------|:-------------|:-:|:------|:-------------|\n'
const entries = Object.entries(changelog.labels)
for (let i = 0; i < entries.length; i++) {
body += `| ${entries[i][0]} | ${entries[i][1]} |`;
body += entries[++i] ? `| ${entries[i][0]} | ${entries[i][1]} |\n` : '|||\n';
}
github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body
});
return core.setFailed('No label has been set.');
}
우선 package.json
의lerna-changeelog 정의에서 설정해야 할 탭 목록을 가져옵니다.요청에 설정된 모든 탭을 가져옵니다.
이 목록에 일치하는 항목이 없으면 인용 요청에 오류 메시지를 주석하고
return core.setFailed();
에서 오류를 끝냅니다.※ 예시 중 태그를 쓸 수 있는 댓글을 달아야 하기 때문에 복잡하지만, 간단한 정보도 괜찮다
참고 자료
실제 사용된 태그 대응 테이블을 나열합니다.
본 보도는 서비스를 제공하다.js에서 신축식 기반으로 발행의 절차로 서비스의 발표를 전제로 용도와 설명이 좀 특별할 수 있으니 참고가 되었으면 좋겠습니다.
노트 를 발행 하다
Lv.
색상
GiitHub 레이블
제출 접두사
설명
💥 Breaking Change
major
Type: Breaking
(N/A)
호환되지 않는 기능 변경이 제공됨
🎉 New Feature
minor
Type: Feature
feature:
API 추가 등 새로운 기능 제공
🚀 Enhancement
minor
Type: Enhancement
enhance:
기존 제공 기능의 확장 등
💉 Bug Fix
patch
Type: BugFix
fix:
기존 제공 기능의 고장 수정
⚠️ Deprecated
patch
Type: Deprecated
deprecated:
기존 제공 기능에 대한 추천하지 않음
📝 Documentation
patch
Type: Docs
docs:
문서 추가 또는 수정
✨ Refactoring
patch
Type: Refactoring
refactor:
내부 오류 수정 또는 기능 추가 변경 사항 없음
✅ Testing
patch
Type: Testing
test:
테스트 추가 또는 기존 테스트 수정
🛠️ Build
patch
Type: Build
build:
프로젝트 구성 수정
📦 Dependency
patch
Type: Dependency
chore(deps):
외부 종속 모듈 수정
📦 Dependency
patch
Type: Dependency
chore(deps-dev):
개발용 외부 의존 모듈의 변경
-
-
Type: Release
-
판정 요청 게시
-
-
Type: Canary
-
카나리아
총결산
GiitHub Actions에서 제출 요청에 대한 제출 메시지를 받을 수 있습니다.
이렇게 하면 메시지를 보내는 문자열에서 인용할 탭을 찾을 수 있습니다.
lerna-change elog에서 CHANGELOG.MD가 자동으로 생성되는 환경에서 CHANGELOG는 당겨야 할 탭에서 선택합니다.MD를 만들었기 때문에 제출 정보에서 자동으로 라벨을 부여하는 것이 효율적이다.또한 Conventional Commiits 등의 개발 포트폴리오와도 잘 어울립니다.
라벨의 자동 권한 수여를 넣었기 때문에 라인이 요구하는 라벨을 가져오기 쉽습니다. 라벨은 반드시 검사를 해야 합니다.lerna-changeelog의 CHANGELOG입니다.md 생성을 더욱 효과적으로 합니다.
유연한 스크립트를 만들 수 있다는 점도 GiitHub Actions의 장점입니다.
관련 보도
제출 로그에서 확장 가능한 태그로 GiitHub Actions 붙여넣기(본문)
사이트 축소판 그림
Reference
이 문제에 관하여(제출 로그에서 확장 가능한 태그로 GiitHub Actions 붙여넣기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/lulzneko/articles/labeling-pr-from-commitlog-with-githubactions텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)