gitlabci에 깊이 들어가는 여정

19562 단어 cisubtreegitgitlab

모험의 시작


경외심을 불러일으키는 운동에 많은 시간을 들인 후.IO 플랫폼에서 저는 새로운 언어를 많이 배웠고 조언을 많이 받았습니다.많은 실천 경험을 쌓은 후에 나는 그것을 자동화하고 공업화하려고 시도했다.나는gitlabci가 제시한 고급 기능을 발견할 수 있다.제 피드백입니다.

운동주의


Exercism은 지역 사회 사이트로 새로운 언어를 배우고자 하는 사람들은 자원봉사자 지도교사로부터 전문가의 조언을 받을 수 있다.
언어를 배우기 위해서는 언어에서 규칙적으로 진행될 수 있도록 논리적 순서에 맞는 연습 경로를 따르는 것을 권장한다.
다음은 플랫폼에서 사용할 수 있는 모든 트랙(학습 경로)의 목록입니다.

Exercism에서 이 연습들을 다운로드하고 업로드할 수 있는 cli를 제공합니다.이 시스템은 매우 좋지만 버전 제어를 git로 대체할 수 없습니다.그래서 나는git로 나의 연습을 수정했다.
exercism 폴더는 각 언어의 하위 폴더로 구성되어 있으며, 각 언어는 각각의 exercism 폴더를 포함합니다.
다음은 exercism 폴더의 구조 예시입니다.
exercism
+-- c
|   +-- hello-world
|       +-- hello-world.c
|       +-- hello-world-test.c
+-- go
|   +-- leap
|   |   +-- leap.go
|   |   +-- leap_test.go
|   +-- hamming
|       +-- hamming.go
|       +-- hamming_test.go
+-- ruby
    +-- sieve
        +-- sieve.rb
        +-- sieve_test.rb
모든 연습에는 테스트가 있어 검증한다.연습 사용TDD method.테스트가 검증되면 해결 방안을 제출하고 지도교사에게 돌아가도록 요구할 수 있다.
많은 해결 방안을 쌓은 후에, 나는 IC를 가지고 싶다. 새로운 테스트가 추가되면, 이것은 내가 안정되고, 나의 연습을 최신식으로 유지할 수 있도록 허락할 것이다.
또한 궤도/언어에 따라 테스트를 수행하는 방식도 유사하다.예를 들어 고의 연습은 명령go test이나java연습gradle test을 사용하여 테스트를 진행한다.
따르려면DRY principle 같은 언어의 모든 연습에 적용할 수 있는 CI 템플릿을 가지고 새 연습에 추가할 수 있습니다.
오픈 소스 프로젝트에 사용할 수 있는 다양한 지속적 통합 솔루션(Jenkins, Circleci, Travis CI, Codeship Gitlab CI)을 비교했습니다.내가 gitlabci를 선택한 것은 가장 재미있는 규범과 기능을 제공했기 때문이다.

🦊 강력한 기능: 모/자 파이프


Gitlab은 무료 CI를 제공하여git 프로젝트에 쉽게 집적할 수 있고 심지어는 Github 프로젝트에도 집적할 수 있다.쿨, 나의 환매 협의는 github에 있다.

모/자 파이프


CI에서 CI를 수행할 수 있습니다.따라서 메타 CI를 만들 수 있습니다.몇 가지 제한 사항은 나중에 볼 수 있지만 상위 하위 파이프라인에서는 CI를 세 가지 중첩 레벨로 분산할 수 있습니다.
  • 연습 폴더의 루트 디렉토리에 있으며 각 언어에 대해 CI를 실행합니다.가장 간단한 파일은 다음 언어의ci를 터치하기만 하면 됩니다.
  • emacs-lisp:
      stage: test
      trigger:
        project: EmilienMottet/exercism-emacs-lisp-sol
        strategy: depend
      rules:
        - changes:
            - emacs-lisp/*
    
    x86-64-assembly:
      stage: test
      trigger:
        project: EmilienMottet/exercism-x86-64-assembly-sol
        strategy: depend
      rules:
        - changes:
            - x86-64-assembly/*
    
    Full file
  • 각 연습에 대해 CI를 실행할 각 언어의 어근:
  • {
       "generate_c_gitlab_ci": {
          "artifacts": {
             "paths": [
                ".c-*-gitlab-ci.yml"
             ]
          },
          "image": {
             "entrypoint": [
                ""
             ],
             "name": "bitnami/jsonnet:latest"
          },
          "needs": [
             {
                "job": "build_vars",
                "pipeline": "$PARENT_PIPELINE_ID"
             }
          ],
          "script": [
             "jsonnet -m . --ext-str exercism_projects=\"$( echo $DIR_TO_BE_TESTED | sed -En 's/ /\\n/p' )\" --ext-str lang=\"c\" \".c-gitlab-ci.jsonnet\""
          ],
          "stage": "build"
       },
       "test_c_armstrong-numbers": {
          "stage": "test",
          "trigger": {
             "include": [
                {
                   "artifact": ".c-armstrong-numbers-gitlab-ci.yml",
                   "job": "generate_c_gitlab_ci"
                }
             ],
             "strategy": "depend"
          }
       },
       "test_c_hello-world": {
          "stage": "test",
          "trigger": {
             "include": [
                {
                   "artifact": ".c-hello-world-gitlab-ci.yml",
                   "job": "generate_c_gitlab_ci"
                }
             ],
             "strategy": "depend"
          }
       }
    }
    
    Template file
  • 실행 플랫폼에서 제공하는 테스트의 각 연습의 루트:
  • {
       "default": {
          "image": "gcc:latest"
       },
       "test-c-armstrong-numbers-exercism": {
          "script": [
             "cd armstrong-numbers",
             "make"
          ]
       }
    }
    
    Template file
    지정된 경로에서 수정된 경우에만 CI 작업을 새로 푸시할 수 있도록 하는 규칙 필드의 사용을 주의하십시오.
    간단하게 보기 위해서, 나는 나의 CI를 모형화해야 한다. 하나의 예는 jsonnet 이다.다음은gitlab팀이 제기한 예이다.https://gitlab.com/gitlab-org/project-templates/jsonnet.

    각 시나리오의 템플릿



    gitlab ci.yml 파일은 jsonnet 형식으로 설명할 수 있습니다.
    예를 들면 다음과 같습니다.
    local exercism_projects = std.map(function(x) std.strReplace(x, '/', ''), std.split(std.extVar('exercism_projects'), '\n'));
    local lang = std.extVar('lang');
    
    local CTestJob(name) = {
      ['.' + lang + '-' + name + '-gitlab-ci.yml']: {
        default: {
          image: 'gcc:latest',
        },
        ['test-' + lang + '-' + name + '-exercism']: {
          script: [
            'cd ' + name,
            'make',
          ],
        },
      },
    };
    
    
    std.foldl(function(x, y) x + y, std.map(CTestJob, exercism_projects), {})
    
    이 템플릿은gitlab ci를 설명할 수 있습니다.yml은 C 연습을 대표한다.
    도덕, Jsonet 템플릿은 중복을 피하기 위해 완벽합니다!

    완벽한 집적 회로, 다중 프로젝트 라인


    친자관은 매우 훌륭하지만 몇 가지 결함이 있는데 그 중 두 가지는 주의할 만하다.
  • 네스트된 서브파이프는 두 레벨에 불과합니다.나의 경우, 나는 세 개의 등급이 필요하다.다중 항목 파이프를 사용하면 이 제한을 통과할 수 있습니다.
  • 마지막으로 제출할 때 수정된 파일을 관리하여 모든 연습이 재생성되지 않도록 합니다.
  • 수정 파일의 관리에 대해 사전 처리 절차를 사용하여 수정된 파일을 다시 계산할 수 있다.
    build_vars:
      stage: .pre
      script:
        - |
          if [ "$CI_PIPELINE_TRIGGERED" = "true" ]; then
            DIR_TO_BE_TESTED=$(ls -d */)
          else
            DIR_TO_BE_TESTED=$(git diff --name-only $CI_COMMIT_SHA^ $CI_COMMIT_SHA */ | cut -d'/' -f1 | sort | uniq)
            if [ -z $DIR_TO_BE_TESTED ]; then
              DIR_TO_BE_TESTED=$(ls -d */)
            fi
          fi
        - echo DIR_TO_BE_TESTED=$DIR_TO_BE_TESTED >> build.env
        - cat build.env
      artifacts:
        reports:
          dotenv: build.env
    
    
    연습을 수정하면 가공소재로 내보내고 나중에 생성된 작업과 공유할 수 있습니다.

    하위 모드와 하위 트리


    끼워 넣는 수량이 제한되어 있고, 서로 다른 곡을 분리하기를 원하기 때문에, 나는 모든 곡에 git 저장소를 만들었다. (ansible를 통해 자동으로 실행할 수 있는 수동 조작)
    이 플러그인 프로젝트를 관리하는 대표적인 방법은git 서브 모듈을 사용하는 것이다.그러나 일치된 git 서브 모듈을 유지하는 것은 최신식이어서 매우 제한될 수 있습니다.
    또 하나의 선택!하위 트리:
    git-subtree - Merge subtrees together and split repository into subtrees
    
    내가 서브트리에서 발견한 장점은 내가 이런 궤적만 거울로 볼 수 있고 git 갈고리만 사용하면 이 점의 자동화를 실현할 수 있다는 것이다.이것은 내가 가지고 있는 것을 수정할 필요가 없다.
    하위 트리 만들기는 더 이상 간단할 수 없습니다.
    git subtree add --prefix=clojure --squash [email protected]:EmilienMottet/exercism-clojure-sol.git master
    
    그리고 서브트리가 최신식임을 확인하기 위해post-commit에 갈고리를 추가하면 됩니다.
    이것은 내 갈고리 파일.git/hooks/post-commit:
    #!/bin/sh
    
    subtree_push(){
        git subtree push -P "$1" [email protected]:EmilienMottet/exercism-"$1"-sol.git master
    }
    
    for dir in */; do
        subtree_push "$( basename "$dir" )" 2> /dev/null &
    done
    
    
    for dir in */; do
        wait
    done &
    
    제출할 때마다 모든 하위 트리가 백그라운드에서 업데이트됩니다.

    결론


    나는 이 문장이 너로 하여금 한번 시험해 보게 하기를 바란다.io, 왜 이 커뮤니티에 가입하지 않았어요?
    가능한 한 빨리 공업화를 실현하다.그러나 Exercism에는 다음과 같은 버전 관리 시스템이 있습니다.
    예를 들어 나는 몇 대의 기계에서 연습을 할 수 있다
  • 자동화로 많은 시간 절약
  • 백업 시스템 1개
  • 사용 내역만 관리
  • 내 작품을 공유하고github에 표시한다.일반 도메인 이름 형식.
  • 너 자신을 테스트해 봐. 운동의 기초는 TDD야.자신과 코드를 계속 테스트하는 것이 중요하다.또한, 저는 제 exercism과 모든 언어의 최신 버전을 호환하고, 미래에 지역 사회에 추가된 새로운 테스트와 호환하고 싶습니다.최신 exercism을 가지면 항상 최신 exercism을 가질 수 있습니다. 이것은 좋은 예입니다. 이것은 당신에게 많은 별을 가질 수 있습니다.)
    마르다반복하지 마, 반복하지 마!우선, 인식 분해는 선명성을 얻을 수 있다.피난과 지식의 전파를 허용하다.몇 번이나, 거의 자동적인 명령을 내렸지만, 몇 달 후에 그것을 실행하지 않아서, 결국 그것을 잊어버렸다.틀을 만드는 데 시간을 쓰면 이 시간은 곧 얻을 수 있다.
    감사합니다:)

    좋은 웹페이지 즐겨찾기