programing

src에 변경 사항이 있는 경우에만 빌드 실행

stoneblock 2023. 10. 1. 19:15

src에 변경 사항이 있는 경우에만 빌드 실행

이야기:

당사에는 내부 Angular에 대해 트랙터를 사용하여 엔드 투 엔드 테스트를 자동화하는 작업을 수행하는 테스터 팀이 있습니다.JS application.이들이 "로컬" 테스트를 위해 실행하는 작업은 다음과 같습니다.

grunt.registerTask('e2e:local', [
    'build:prod',
    'connect:test',
    'protractor:local'
]);

이것은 "빌드" 작업을 실행하고, 웹 서버를 시작하고, 로컬 빌드에 대해 e2e 테스트를 실행합니다.

build:prod태스크 자체는 다음과 같이 정의됩니다.

grunt.registerTask(
    'build:prod', [
        'clean',
        'copy:all',
        'copy:assets',
        'wiredep',
        'ngtemplates',
        'useminPrepare',
        'concat',
        'ngAnnotate',
        'autoprefixer',
        'uglify',
        'cssmin',
        'copy:cssfix',
        'usemin',
        'copy:html',
        'bowercopy',
        'template:setProdVersion'
    ]
);

여기에는 여러 가지 하위 작업이 있습니다(분명히 개선될 수는 있겠지만, 지금의 모습입니다).

문제:

현재 빌드가 완료되는 데 약 25초가 소요됩니다.그리고 사람이 엔드 투 엔드 테스트를 실행할 때마다 빌드 작업이 실행됩니다.

질문:

어떻게 실행할 수 있습니까?build:prod이 있는 src리?


여기서 요구하는 것은 테스트를 실행하는 테스트자를 위해 투명하게 만드는 것입니다.빌드를 수행해야 할 때와 수행하지 말아야 할 때를 기억하지 않았으면 합니다.

즉, 프로세스를 자동화해야 합니다.빌드가 필요한지 여부를 자동으로 감지하는 것이 목표입니다.

으로 를 통해 호출되는 빌드 grunt build:prod이전 빌드의 날짜 스탬프에 관계없이 재구축됩니다.


생각과 시도:

  • 밀접하게 관련된 패키지가 있지만, 우리는 다소 복잡한 빌드를 가지고 있기 때문에,clean제 에 어떻게 요,다.

  • 에서.e2e:local다크 합니다.dist그리고.src그리고 그것을 바탕으로, 결정합니다.build:prod호출이 필요합니다.합니다인 것 .grunt-newer다를 .

  • 우리는 성능 향상에 도움이 되는 것을 사용하기 시작했습니다.

git을 사용하는 경우 다음과 같은 아이디어가 있습니다.

grunt-gitinfo와 같은 것을 사용하고 HEAD의 마지막 커밋을 기본으로 사용하는 것은 어떻습니까?

아이디어는 다음과 같습니다.

  • 최신 커밋 해시를 확인하는 새 그런트 태스크를 생성합니다.
  • gitignore 음)에 없음)clean 수 더음 repo으로)
  • () 합니다)을 fs모듈이 읽기/쓰기를 쉽게 할 수 있음)
  • 합니다를 합니다.build:prod 그런 새
  • 는 됩니다 새.build:prod

다른 옵션(여전히 git을 사용):

그룬트-기트 후크 같은 것을 사용하여 당긴 후에 실행하여 깃을 호출하는 깃 후크를 만들 수 있습니다.build:prod에서 제거할 수 있습니다. grunt

기스턱을 확인하고 필요한 경우 설치할 다른 코드가 있을 수 있지만, 이 코드는 테스터에게 일회성 추가 단계가 될 수도 있고, 테스터가 호출하는 그룬트 작업에 구워질 수도 있습니다.

아직 아무도 grunt-contrib-watch에 대해 언급하지 않았다는 것이 놀랍습니다. (gruntjs.com 예제 파일에 나와 있고 꽤 흔하게 알려진 것이라고 생각했습니다!).github에서: "감시하는 파일 패턴이 추가, 변경 또는 삭제될 때마다 미리 정의된 작업 실행" - src/ 또는 test/에서 .js 파일이 수정되거나 Grunt 파일이 수정될 때마다 작업을 실행하는 grunt 파일 샘플입니다.

var filesToWatch = ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'];
grunt.initConfig({
    watch: {
        files: filesToWatch,
        tasks: ['build:prod',
                'connect:test',
                'protractor:local']
    }
});
grunt.loadNpmTasks('grunt-contrib-watch');

를 하도록 합니다.grunt watch할 때마다 됩니다(더에를 다음)).grunt build:prod매번)

훌륭한 패키지이며 확인해보시기를 권합니다. -- github -- npmjs.org

npm install grunt-contrib-watch --save-dev

에서 .grunt은 , , 으로 입니다.gulp.

var fs = require('fs');
var gulpif = require('gulp-if');

var sourceChanged = fs.statSync('build/directory').mtime > fs.statSync('source/directory').mtime;

gulp.task('build:prod', function() {
  if (!sourceChanged) {
    return false;
  } 
  return gulp.src('./src/*.js')
    .pipe(.... build ....)
    .pipe(gulp.dest('./dist/'));
});

우리가 우리의 빌드를 위해 Git HEAD Sha 작업을 수행한 방법은 다음과 같습니다.현재 운영 환경에 어떤 버전이 구축되어 있는지 확인하는 데 사용합니다. 하지만 부울을 반환하고 진실일 경우 빌드를 트리거하기 위해 재작업할 수 있을 것이라고 확신합니다.

Gruntfile.js

function getHeadSha() {
  var curr, match, next = 'HEAD';
  var repoDir = process.env.GIT_REPO_DIR || path.join(__dirname, '..');
  try {
    do {
      curr  = grunt.file.read(path.join(repoDir, '.git', next)).trim();
      match = curr.match(/^ref: (.+)$/);
      next  = match && match[1];
    } while (next);
  } catch(ex) {
    curr = 'not-found';
  }

  return curr;
}

grunt.initConfig({
  replace: {
    applicationVersion: {
      src:  '<%= config.dist %>/index.html',
      overwrite: true,
      replacements: [{
        from: '{{APPLICATION_VERSION}}',
        to:   getHeadSha
      }]
    }
  }
});

grunt.registerTask('build', {
  'replace:applicationVersion',
  /** other tasks **/
});

grunt.registerTask('e2e:local', {
  'check_if_we_should_build',
  /** other tasks **/
});

색인을 보다

<html data-version="{{APPLICATION_VERSION}}">
  <!-- -->
</html>

이 모든 과정을 단순화할 수 있는 git-info 패키지도 있습니다. 우리는 그것으로 전환하는 것을 고려하고 있습니다.

편집; 나는 @meligy가 이미 당신을 git-info. credit으로 가리키는 것을 알아차렸습니다.

도움이 될지는 모르겠지만 GULP 프레임워크를 사용하여 프로젝트를 진행한 것과 같습니다.우리는 지속적으로 소스 변경을 확인하고 빠른 함수를 실행하여 프로젝트를 구축하는 watcher를 작성하였습니다.트랙터 테스트 케이스입니다.

gulp.task('dome', function () {


    gulp.src(["maintest.js"])
        .pipe(notify("Change Found , Executing Scripts."))
        .pipe(protractor({

            configFile: "conf.js",
            args: ['--baseUrl', 'http://127.0.0.1:8000']


        })).on('error', function (e) {
        throw e
    });
})


gulp.task('default', function () {


    gulp.watch('./webpages/*.js', ['dome']);
    gulp.watch('maintest.js', ['dome']);
    gulp.watch('conf.js', ['dome']);
});

repo로 연결합니다.

트랙터에 대한 경험은 없지만 개념적으로는 이게 효과가 있을 것 같아요.

제안할 수 있는 것은 ~/.cshrc에 별칭을 설정하여 다음과 같은 경우에만 빌드 명령을 실행하는 것입니다.diff명령이 true를 반환합니다.

#./cshrc

alias build_on_diff 'diff -r branch_dir_1 branch_dir_2\
if ( $status == 1 ) then\
build:prod\
endif'

교체만 하면 됩니다.diffgit이 사용하는 명령은 무엇이든 사용할 수 있으며, 탐지된 차이에 대해 1 상태를 반환하는 경우에만 작동해야 합니다.변경되지 않은 파일을 재구축하지 않기 위해 저희 회사에서도 비슷한 방법을 적용하고 있습니다.

언급URL : https://stackoverflow.com/questions/31192065/run-build-only-if-there-are-changes-in-src