Travis CI로 소프트웨어 구축 교육

(이것은 2014 년의 오래된 기사입니다. https://www.cs.cmu.edu/~ckaestne/travis/. 저는 우리가 수업 프로젝트에 Travis CI를 처음 사용했다고 생각합니다. 그들은 우리 수업에서 Travis CI를 사용하여 지불 할 수있는 방법을 알아 내려고 할 때 우리를 위해 무료 계정 메커니즘을 해킹했습니다. 지금까지는이 중 많은 부분이 훨씬 더 원활 해졌습니다. 우리는 여전히 많은 수업에서 그것을 사용합니다.)

Travis CI를 사용하여 소프트웨어 구축 과정에 지속적인 통합 도구를 도입 한 경험이 있습니다. 나는 이것을 다른 코스에서도 사용하는 것이 좋습니다. 설정이 쉽고 안정적으로 작동하며 학생과 조교 모두에게 도움이됩니다.

문맥

저는 CMU 학부 과정 15–214 Principles of Software Construction : Objects, Design 및 Concurrency를 가르치고 있습니다.이번 학기에 두 번째로. 이 과정은 소프트웨어 디자인과 객체 지향 프로그래밍을 소개하는 2 년차 과정이며 첫해에 더 많은 알고리즘 중심 과정을 거친 후 첫 번째 중간 크기 프로그래밍 과제로 많은 학생들에게 도전합니다. 무엇보다 학생들은 단위 테스트를 연습하고, Scabble과 유사한 게임 (핵심 로직에서 사용자 인터페이스까지)을 설계 및 구현하고, 소셜 미디어 분석 도구 (라이브러리 및 프레임 워크를 통한 재사용에 중점)를 구현하고, 간단한 맵 축소 프레임 워크를 구현합니다. Java로 가르친 과정. 매 학기 약 180 명의 학생들이 참여하는 대규모 과정입니다. 이전 학기에 저는 이미 기존의 소프트웨어 엔지니어링 과정 15-313을 수강 한 17 명의 학생과 함께 Github 및 Travis-CI를 실험했으며 소규모 프로젝트 및 코드 검토에도 사용했습니다.

목표

이 과정의 목표는 현실적인 소프트웨어 개발 및 소프트웨어 엔지니어링 사례를 가르치는 것입니다 (이 과정에서는보다 기술적 인 측면에 중점을 둡니다). 과정에서 명시 적으로 가르치는 것은 거의 없지만 버전 제어 및 지속적 통합은 학생들이 디버거, 리팩토링 도구 및 일반적인 IDE와 마찬가지로 일상적인 사용을 위해 사용하고 수용하는 방법을 배워야하는 확실한 도구입니다.

코스에서 지속적 통합을 사용하기위한 몇 가지 목표가 있습니다. 먼저, 우리는 빌드 시스템과 지속적인 통합을 유용한 도구로 가르치고 학생들이 it-compiles-in-my-IDE 모드에서 벗어나도록하고 싶습니다. 둘째, 각 제출물을 별도의 서비스로 컴파일하면 학생들이 파일 체크인을 잊었 음을 지적 할 수 있는데, 이는 특히 구성 파일과 라이브러리가 관련된 학기 후반에 일반적인 문제였습니다. 셋째, 학생들이 특정 IDE (모든 사람이 동일한 IDE를 사용하고 있다고 예상) 또는 특정 운영 체제에만 전적으로 의존해서는 안되며 실제로 빌드 자동화를 연습해야한다는 점을 강조하고 싶습니다. 마지막으로 지속적인 통합은 채점 프로세스를 단순화했습니다. 더 이상 빌드 종속성이나 잊어 버린 Eclipse 프로젝트 파일을 검색 할 필요가 없었지만 Travis에서 제출물이 컴파일되고 테스트가 실행되었는지 신속하게 확인할 수있었습니다. Travis-CI는 학생들이 제출물을 확인하는 데 사용할 수있는 중립적 인스턴스 역할을했습니다.

설정

학생들이 작업에 버전 관리 시스템을 사용하고 이러한 방식으로 과제를 제출하기를 바랍니다. 그러나 학생 코드는 비공개로 유지해야합니다. 학생들은 다른 학생들의 제출물을 볼 수 없습니다.

코스의 모든 학생은 자신과 코스 직원 만 액세스 할 수있는 개인 Github 저장소를 가지고 있습니다. Github는 이러한 목적을 위해 개인 조직 계정을 제공했습니다. 우리는 다른 할당에 대해 다른 하위 폴더와 함께 모든 할당 및 암송에 동일한 저장소를 사용합니다 (그렇지 않으면 약 1000 개의 저장소를 관리해야합니다). 유일한 예외는 별도의 저장소를 만든 하나의 팀 할당입니다. 리포지토리 (자체 등록)를 만들고 한 번에 180 개의 리포지토리에 새 콘텐츠를 푸시하기 위해 몇 가지 간단한 웹 및 셸 스크립트를 만들었습니다. 또한 한 과제에 Github의 문제 추적기를 사용하여 학생들에게 테스트 중에 식별 한 모든 버그를보고하고 (우리가 제공 한 일부 코드에서) 나중에 버그를 닫고이를 수정하는 커밋과 연결하도록 요청했습니다.

처음 몇 번의 입문 과제 후에 우리는 단위 테스트와 지속적인 통합을 소개하는 과정의 일부에 이르렀습니다. 예를 들어 Jenkins를 사용하여 자체 인프라를 설정하는 것을 잠시 고려했지만 신속하게 반대 결정을 내 렸습니다. 너무 많은 함정과 보안 관련 문제가 있으며 (모든 학생이 서로 제출물을 볼 수없고 빌드가 임의의 코드를 실행할 수 있기 때문에) 너무 많은 노력을 기울여야합니다. 우리는 대신 Travis-CI를 선택했습니다.이 제품은 즉시 사용 가능하며 기본적으로 필요한 작업을 정확히 수행합니다.

개인 리포지토리에 대한 지원이 필요하기 때문에 Travis Pro를 선택했습니다. Travis 팀에 연락하여 학기 시작 계획을 구매할 때 (일반적인 법적 검토 후 관리자가 지불 방법을 확인한 후) Travis는 우리 수업을위한 서비스를 후원하겠다고 아낌없이 제안했습니다. 그 후 Travis-CI를 각 학생의 저장소와 연결하는 것은 180 개 프로젝트 모두에 대해 Travis의 인터페이스에서 ON 버튼을 클릭하기 만하면됩니다 (진지하게 스크립트 할 방법이 있나요? 안타깝게도 학생은 자신의 리포지토리를 활성화 할 수 없습니다.) 이로 인해 Github는 학생들에게 개인 키가 추가되는 것에 대해 수상 쩍은듯한 알림을 보내며이를 미리 경고했습니다. 처음에는 Travis-CI가 실제로 우리 시나리오를 지원하는지 알아내는 데 약간의 시간이 걸렸지 만 일단 파악하면 전체 설정이 간단하고 쉬웠습니다.

우리는 각 학생의 Github 저장소에 두 개의 파일을 푸시했습니다. 하나는“language : java”라는 줄만있는 .travis.yml 파일과 학생들이 숙제를 위해 제공해야하는 ant 파일을 호출하는 build.xml ant입니다. 여러 개의 숙제 프로젝트가있는 하나의 저장소가 있습니다. 저장소 루트의 빌드 스크립트는 단순히 개별 숙제 프로젝트의 빌드 스크립트를 호출합니다.

우리의 시작 계획에는 두 개의 동시 빌드가있었습니다. 우리는 이것이 180 명의 학생들, 특히 마감일 전 시간에 충분한 지 걱정했습니다. 또한 Travis는 한 시간 후에 만 ​​빌드 시간을 초과했으며 과거에 학생들이 무한 루프로 테스트 케이스를 작성하는 것을 보았습니다. 그래서 우리는 빌드 길이를 제한하는 메커니즘을 찾았습니다. 첫 번째 단계로 루트 빌드 스크립트에서 현재 숙제의 빌드 만 활성화하여 이전 할당에서 빌드를 제거했습니다. 그런 다음 시간 초과 메커니즘을 찾았습니다. 빌드 시스템을 선택할 때 ant는 우리가 찾던 기능을 가지고있었습니다 : 하위 빌드에 대한 타임 아웃 (우리가 ant보다 선호했던 Gradle 또는 sbt에서 비슷한 것을 찾지 못했습니다). 결국 우리의 루트 개미 파일은 다음과 같습니다.

<?xml version="1.0"?>
<project name="214repo" default="test" basedir=".">
  <target name="test">
    <parallel threadCount="1" timeout="60000">
      <sequential>
        <echo message="==================== BEGIN ANT BUILD =====================" />
<subant target="test">
            <fileset dir="homework/4/" includes="build.xml"/>
          </subant>
        <echo message="==================== END HW4 OUTPUT ======================" />
</sequential>
    </parallel>
  </target>
</project>

교훈

전반적으로 경험이 좋았고 향후 학기에도 Github 및 Travis-CI를 계속 사용할 계획입니다. 일부 학생들은 개미 빌드 스크립트를 작성하는 방법을 배워야한다고 불평했지만 일반적으로 지속적인 통합 사용에 대한 긍정적 인 피드백 만 받았습니다. 몇몇 학생들은이 과정에서 다룬 것보다 지속적 통합 및 기타 도구에 대해 더 많이 배우고 싶다고 말했습니다.

동시 빌드가 2 개뿐이기 때문에 긴 빌드 대기열에 대해 걱정했지만 (약 15 초의 새 빌드를 시작할 때 Travis에 약간의 오버 헤드가 있음) 실제로 관찰 한 적이 없습니다. 마감일 전날 밤에는 대기열과 매우 활동적인 기간이 있었지만 일반적으로 학생 제출 용 빌드는 비교적 빠르게 처리되었습니다.

빌드 대기열이 정말 길었던 유일한 시간은 새로운 숙제를 푸시하고 180 개의 모든 저장소에서 빌드를 암시 적으로 트리거했을 때였습니다. 우리는“ [skip ci] ” 사용법을 빨리 배웠습니다 . :)

또한 미리 계획을 세워야한다는 것도 배웠습니다. Travis-CI는 전적으로 백그라운드에서 작업했으며 너무 잘 작동했기 때문에 항상 계획에 포함하지는 않았습니다. 어떤 경우에는 마감일 며칠 전까지 새 숙제를 실행하도록 루트 빌드 스크립트를 변경하는 것을 잊었습니다. 그룹 할당을위한 새 저장소를 만들 때 처음에는 Travis-CI도 활성화하는 것을 잊었습니다.

우리는 여전히 Travis-CI와 함께 git 서브 모듈을 사용하는 방법을 알아 내야합니다. 여기서 모듈과 서브 모듈은 모두 비공개 프로젝트입니다 (그룹이 다른 그룹에서 개발 한 프레임 워크 용 플러그인을 구현하는 하나의 할당에 필요한 설정). 추가 키 설정 방법이있는 것 같지만 시간이 충분하지 않았기 때문에이를 충분히 조사하지 않았습니다. 다음 학기.

Travis-CI의 또 다른 좋은 점은 좋은 타임 스탬프를 제공한다는 것입니다. git 커밋의 타임 스탬프는 본질적으로 신뢰할 수 없으므로 실제로 학생들이 작업을 Github에 푸시 한 시점의 타임 스탬프를 확인해야합니다. 이 정보는 Github의 API를 통해 액세스 할 수 있지만 Github 웹 페이지에서는 잘 보이지 않습니다. Travis-CI에서 이것은 실제로 확인하기 매우 편리합니다.

향후 학기를위한 또 다른 프로젝트는 빌드 스크립트에 Findbugs와 Checkstyle을 통합하는 것입니다. 우리는 이미 학생들에게 Findbugs를 실행하도록 권장하지만 Findbugs가 발견 할 수있는 문제에 대해 점수를 취하겠다고 협박하지 않는 한 거의 그렇게하지 않습니다. Maven 저장소에서 종속성 (Findbug 포함)을 자동으로 가져 오는 메커니즘을 통합하는 것은 탐색 할 가치가있는 또 다른 방향이지만 ant로 설정하는 것은 간단하지 않을 수 있습니다.

다른 사람이 유사한 방식으로 지속적인 통합을 통합하고 몇 가지 팁이 있는지 듣고 싶습니다. 일부 코스는 autolab 및 기타 자동 채점 도구를 사용하여 학생 코드에서 강사 제공 테스트 케이스를 자동으로 실행하지만 학생들이 테스트를 담당하고 학생들이 다음 프로젝트에서 즉시 사용할 수있는보다 현실적인 인프라를 제공하는 것을 선호합니다. (그리고 나는 어쨌든 자동 채점을 좋아하지 않는다). 누군가 비슷한 설정을 시도하고 싶다면 요청에 따라 더 자세한 내용과 스크립트 중 일부를 공유해 드리겠습니다.

Suggested posts

Monolith에서 Microservices로 이동하는 방법

바위를 분해합니다.

Monolith에서 Microservices로 이동하는 방법

지난 기사 시리즈에서는 모두 단일 주 기능으로 실행되는 모 놀리 식 Java 클래스 집합을 만들었습니다. 이 기사와 향후 기사에서는 이들을 별도의 서비스로 분리하고 Kubernetes의 Docker Desktop 버전에서 모두 실행하겠습니다.

Semver는 좋고 오픈 소스 도구의 위기

Semver는 좋고 오픈 소스 도구의 위기

여기에 언급 된 의견은 제 회사의 의견이 아니라 제 의견입니다. 지난주에 나는 Hynek Schlawack의“Semantic Versioning Will Not Save You”라는 기사를 읽었고 많은 의견에 동의하지 않았습니다.