제출 로그에서 확장 가능한 태그로 GiitHub Actions 붙여넣기

개시하다


CHANGELOGlerna-changelog를 사용합니다.요청에서md를 생성할 수 있습니다.
CHANGELOG.md를 생성할 때 변경 로그의 분류와 제목이 적합하지 않은 것을 발견하면 수정 요청을 통해 대응할 수 있습니다.
이것은 디버그 로그를 사용하는 방법보다 더 유연하다.한편, Conventional Commits 등 방법에 따라 적당한 제출 로그를 활용하면 제출 요청에 같은 내용의 라벨을 붙이는 데 두 번의 번거로움이 발생한다.이는 GiitHub Actions의 CI/CD에 시간을 들여 자동으로 표시하는 것으로 해결됩니다.
다음은lerna-change elog과 GiitHub Actions의 제출 로그의 자동 표시를 소개합니다.

해결하고 싶은 과제

  • 스티커 요청에 문제가 생겼습니다
  • 인덱스 요청의 라벨을 적절하게 사용하지 않음
  • 본문의 전제


  • lerna-change elog으로 댓글에서 발표 노트 생성 기사 환경
  • 원본 코드의 수정은 인용 요청을 바탕으로 한 것으로 가정
  • 작업 환경


    이 글은 다음과 같은 환경에서 동작을 확인했다.
  • GitHub Actions Ubuntu
  • 재설정 요청의 레이블 정의


    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
    #3E1E00
    Type: Breaking
    (N/A)
    호환되지 않는 기능 변경이 제공됨
    🎉 New Feature
    minor
    #224B8F
    Type: Feature
    feature:
    API 추가 등 새로운 기능 제공
    🚀 Enhancement
    minor
    #0071B0
    Type: Enhancement
    enhance:
    기존 제공 기능의 확장 등
    💉 Bug Fix
    patch
    #E7001D
    Type: BugFix
    fix:
    기존 제공 기능의 고장 수정
    ⚠️ Deprecated
    patch
    #AD002D
    Type: Deprecated
    deprecated:
    기존 제공 기능에 대한 추천하지 않음
    📝 Documentation
    patch
    #737373
    Type: Docs
    docs:
    문서 추가 또는 수정
    ✨ Refactoring
    patch
    #008D56
    Type: Refactoring
    refactor:
    내부 오류 수정 또는 기능 추가 변경 사항 없음
    ✅ Testing
    patch
    #006428
    Type: Testing
    test:
    테스트 추가 또는 기존 테스트 수정
    🛠️ Build
    patch
    #AA5C3F
    Type: Build
    build:
    프로젝트 구성 수정
    📦 Dependency
    patch
    #7B4334
    Type: Dependency
    chore(deps):
    외부 종속 모듈 수정
    📦 Dependency
    patch
    #7B4334
    Type: Dependency
    chore(deps-dev):
    개발용 외부 의존 모듈의 변경
    -
    -
    #624498
    Type: Release
    -
    판정 요청 게시
    -
    -
    #ECE038
    Type: Canary
    -
    카나리아

    총결산


    GiitHub Actions에서 제출 요청에 대한 제출 메시지를 받을 수 있습니다.
    이렇게 하면 메시지를 보내는 문자열에서 인용할 탭을 찾을 수 있습니다.
    lerna-change elog에서 CHANGELOG.MD가 자동으로 생성되는 환경에서 CHANGELOG는 당겨야 할 탭에서 선택합니다.MD를 만들었기 때문에 제출 정보에서 자동으로 라벨을 부여하는 것이 효율적이다.또한 Conventional Commiits 등의 개발 포트폴리오와도 잘 어울립니다.
    라벨의 자동 권한 수여를 넣었기 때문에 라인이 요구하는 라벨을 가져오기 쉽습니다. 라벨은 반드시 검사를 해야 합니다.lerna-changeelog의 CHANGELOG입니다.md 생성을 더욱 효과적으로 합니다.
    유연한 스크립트를 만들 수 있다는 점도 GiitHub Actions의 장점입니다.

    관련 보도

  • 서비스를 제공하다.js에서 신축식 기반으로 발행
  • lerna-change elog으로 댓글에서 발표 노트 생성

  • 제출 로그에서 확장 가능한 태그로 GiitHub Actions 붙여넣기(본문)
  • 사이트 축소판 그림

  • lerna-changelog
  • Ship.js
  • 좋은 웹페이지 즐겨찾기