gitlabci에 깊이 들어가는 여정
모험의 시작
경외심을 불러일으키는 운동에 많은 시간을 들인 후.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를 세 가지 중첩 레벨로 분산할 수 있습니다.
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
Gitlab은 무료 CI를 제공하여git 프로젝트에 쉽게 집적할 수 있고 심지어는 Github 프로젝트에도 집적할 수 있다.쿨, 나의 환매 협의는 github에 있다.
모/자 파이프
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 {
"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 템플릿은 중복을 피하기 위해 완벽합니다!
완벽한 집적 회로, 다중 프로젝트 라인
친자관은 매우 훌륭하지만 몇 가지 결함이 있는데 그 중 두 가지는 주의할 만하다.
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), {})
친자관은 매우 훌륭하지만 몇 가지 결함이 있는데 그 중 두 가지는 주의할 만하다.
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에는 다음과 같은 버전 관리 시스템이 있습니다.
예를 들어 나는 몇 대의 기계에서 연습을 할 수 있다
git-subtree - Merge subtrees together and split repository into subtrees
git subtree add --prefix=clojure --squash [email protected]:EmilienMottet/exercism-clojure-sol.git master
#!/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에는 다음과 같은 버전 관리 시스템이 있습니다.
예를 들어 나는 몇 대의 기계에서 연습을 할 수 있다
마르다반복하지 마, 반복하지 마!우선, 인식 분해는 선명성을 얻을 수 있다.피난과 지식의 전파를 허용하다.몇 번이나, 거의 자동적인 명령을 내렸지만, 몇 달 후에 그것을 실행하지 않아서, 결국 그것을 잊어버렸다.틀을 만드는 데 시간을 쓰면 이 시간은 곧 얻을 수 있다.
감사합니다:)
Reference
이 문제에 관하여(gitlabci에 깊이 들어가는 여정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/emilienmottet/a-journey-into-the-depths-of-gitlab-ci-15j5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)