Github 작업을 사용하는 TypeScript 프로젝트의 코드 및 보안 확인

<TLDR> Github 운영 네이티브는 CI 파이핑을 지원합니다.단일 작업 흐름 정의 파일을 저장소에 추가하고 요청마다 자동 테스트, 안전성 및 코드 스타일 검사를 실행합니다.repo</TLDR>의 전체 코드 및 구성
나는 너희들이 시간을 좀 써서 우리의 생활과 업무의 아름다운 시간을 감상하도록 격려한다.
몇 년 전에 지속적인 집적 파이프를 건설하는 데 필요한 것이 무엇인지 상상해 보세요.CI/CD 작업을 호스팅하는 가장 일반적인 도구 중 하나는 Jenkins입니다. 따라서 최소한 다음 작업을 수행해야 합니다.
  • 서버 구성 및 OS 설치
  • 젠킨스 설치
  • 필요한 Jenkins 플러그인 검토 및 설치
  • 제출 및 새 PRs에서 작업을 트리거할 수 있도록 Webhook을 구성하고 Git
  • 와 통합
  • Webhook에 대한 네트워크 액세스가 신뢰할 수 있는 클라이언트로만 제한되는지 확인
  • 일단 모든 것이 준비되면, 너는 아직 다 하지 못했다.사실 너는 아직 다 하지 못했다. 왜냐하면 지금 네가 필요로 하기 때문이다.
  • 운영 체제 및 소프트웨어 패치 및 업그레이드
  • Jenkins 및 플러그인 패치 및 업그레이드
  • 서버 하드웨어 장애 처리
  • CPU, 메모리 및 디스크 사용을 모니터링하여 서버의 활용도가 부족하거나 활용도가 낮은지 확인
  • 솔직히 이런 투자가 필요하기 때문에 모든 프로젝트의 예산이 CI/CD 작업 흐름에 쓰일 수 있는 것은 아니다.

    지금은요?


    클라우드 공급자, 서버 플랫폼이 없고 강력한 도구가 제공하는 현대 기술 덕분에 우리는 며칠 또는 몇 주 안에 신제품/프로젝트를 구축하고 발표할 수 있다.
    바뀌지 않은 것은 코드의 성능, 안전성, 오류, 일치성에 대한 요구이다.
    Github에서 개인 또는 오픈 소스 저장소를 호스팅하는 경우 Github 작업을 사용하여 CI 파이프라인을 구축할 수 있습니다.
    Github는 변경 사항을 제출하거나 요청을 보낼 때마다 사용자가 정의한 작업 (검사) 을 포함하는 CI 작업 흐름을 시작합니다.
    모든 작업은 유용한 작업 (테스트 실행, 코드 스타일 검사 실행 등) 을 수행하고 결과를 보고합니다.
    PR 검토자는 코드의 변경 사항을 확인하는 것 외에 코드를 결합하기 전에 CI 서버의 출력을 검토합니다.

    Github Actions는 공공 저장소에는 무료이며, 개인 재구매에는 아낌없는 무료 계층이 있습니다.상세 정보here.

    실제 세계의 Github CI 워크플로우


    CI 작업 흐름을 만듭니다. 생성된 모든 드래그 요청에 대해 여러 개의 검사를 실행합니다.
    구체적으로 다음과 같은 작업을 수행하고자 합니다.
  • ESLint 및 TypeScript 컴파일러를 실행하여 코드 구문 및 서식을 확인합니다
  • .
  • Jest
  • 를 사용한 유닛 테스트
  • 보안 검사를 실행하여 프로젝트
  • 에 사용된 의존항에 알려진 빈틈이 없음을 확보합니다
  • 문서
  • 에 맞춤법 검사 실행
    알다시피 모든 검사는 백엔드와 프런트엔드 항목에 적용됩니다.
    Github에서는 워크플로우 정의가 .github/workflows 폴더 아래에 있기를 원합니다.거기에 새 파일을 만듭니다.각 부분의 기능 설명을 이해하려면 아래 코드의 주석을 참조하십시오.
    name: CI
    
    on: [pull_request] # we want the workflow to trigger on commits to PRs only
    
    jobs: # each workflow consists of 1+ jobs; by default, all jobs run in parallel
      lint: # job name
        runs-on: ubuntu-latest # host's operating system
        steps: # each job consists of 1+ steps
          - name: Checkout commit # download the code from triggering commit
            uses: actions/checkout@v2
    
          - name: Use Node.js
            uses: actions/setup-node@v1
            with:
              node-version: '12.x'
    
          - name: Cache NPM # leverage npm cache on repeated workflow runs if package.json didn't change
            uses: actions/cache@v1
            with:
              path: ~/.npm
              key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
              restore-keys: |
                ${{ runner.os }}-node-
    
          - name: Install Dependencies
            run: npm ci
    
          - name: Run linter
            run: npm run lint
    
      security: # in this and following jobs, only the last step will be different
        runs-on: ubuntu-latest
        steps:
          - name: Checkout commit
            uses: actions/checkout@v2
    
          - name: Use Node.js
            uses: actions/setup-node@v1
            with:
              node-version: '12.x'
    
          - name: Cache NPM
            uses: actions/cache@v1
            with:
              path: ~/.npm
              key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
              restore-keys: |
                ${{ runner.os }}-node-
    
          - name: Install Dependencies
            run: npm ci
    
          - name: Run security check
            run: npm run audit-security
    
      test:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout commit
            uses: actions/checkout@v2
    
          - name: Use Node.js
            uses: actions/setup-node@v1
            with:
              node-version: '12.x'
    
          - name: Cache NPM
            uses: actions/cache@v1
            with:
              path: ~/.npm
              key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
              restore-keys: |
                ${{ runner.os }}-node-
    
          - name: Install Dependencies
            run: npm ci
    
          - name: Run tests
            run: npm run test
    
      copy:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout commit
            uses: actions/checkout@v2
    
          - name: Use Node.js
            uses: actions/setup-node@v1
            with:
              node-version: '12.x'
    
          - name: Cache NPM
            uses: actions/cache@v1
            with:
              path: ~/.npm
              key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
              restore-keys: |
                ${{ runner.os }}-node-
    
          - name: Install Dependencies
            run: npm ci
    
          - name: Run copy checks
            run: npm run check-copy
    
    step 코드 복제에 있어서 이것은 진정한 최선의 선택이 아니지만, 만약 우리가 PR 페이지에서 단독 프로젝트로 보고하기를 원한다면, 지금은 해결할 방법이 없다.작업 흐름 코드 공유는 고도awaited의 기능이다.
    다음은 워크플로에서 참조하는 스크립트입니다.주의: 일부 명령은 npm-run-all 패키지를 통해 하나의 호출로 조합됩니다.
      "scripts": {
        "lint:eslint": "eslint \"**/*.{ts,tsx}\" --max-warnings=0",
        "lint:tsc": "tsc --noemit",
        "lint:markdown": "markdownlint *.md",
        "lint": "run-p lint:*",
        "audit-security": "audit-ci --config ./audit-ci.json",
        "test": "jest --verbose",
        "check-copy:cspell": "cspell --config=.cspell.json **/*.md",
        "check-copy:language": "write-good *.md --no-passive",
        "check-copy": "run-p check-copy:*"
      },
    
    이렇게!워크플로우 yml 파일을 제출하고 Git로 밀어넣습니다.다음에 끌어오기 요청을 작성하면 PR에서 제출한 워크플로가 실행됩니다. 검사 목록을 확장할 수도 있습니다.실제로 CI 서버나 docker 용기에서 실행할 수 있는 모든 것들, HTTP 요청을 보내서 실행할 수 있는 모든 것들은 CI 작업 흐름의 일부가 될 수 있다.이 가능하다, ~할 수 있다,...
  • Cypress
  • 로 기능 테스트 실행
  • 코드 덮어쓰기 검사를 실행하고 구성된 임계값
  • 보다 백분율이 낮으면 생성 실패
  • 시각 회귀 테스트 실행(이미지 중첩 통과)
  • 실행Lighthouse audit
  • repo에서 코드와 프로필을 찾을 수 있습니다.PR 페이지를 검사합니다. 다른 검사에서 실패한 pull 요청의 예가 있습니다.
    만약 당신이 이런 내용을 좋아한다면 트위터에서 최신 업데이트를 얻을 수 있습니다.

    좋은 웹페이지 즐겨찾기