मैं गिटहब पर निजी रिपोजिटरी पर होस्ट किए गए मेरे सेमेक/सी++ प्रोजेक्ट के लिए एक सीआई स्थापित करने का प्रयास कर रहा हूं।

यह परियोजना कई तृतीय पक्ष पुस्तकालयों पर निर्भर करती है जिन्हें गिट-क्लोन और निर्मित किया जाना चाहिए। उत्तरार्द्ध में कुछ समय लगता है, इसलिए, मैंने सभी निर्भरताओं के साथ एक डॉकर छवि बनाई और इसे डॉकर हब पर होस्ट किया। (आदर्श रूप से, मैं चाहता हूं कि डॉकर छवि भी निजी हो, लेकिन यदि यह संभव नहीं है, तो मैं इसे सार्वजनिक कर सकता हूं।)

मैं निम्नलिखित हासिल करना चाहता हूं:

मास्टर शाखा को पुल अनुरोध पर, एप्लिकेशन स्वचालित रूप से डॉकटर कंटेनर पर बनाया जाता है (क्योंकि सभी निर्भरताएं हैं), सभी यूनिट परीक्षण (gtest) चलाए जाते हैं और, यदि सब कुछ ठीक है, तो शाखा को मास्टर में विलय कर दिया जाता है।

आदर्श रूप से, मैं gcovr/lcov द्वारा जेनरेट किए गए लॉग और आंकड़े देखना चाहता हूं।

ओएस: उबंटू 18.04

मुझे आश्चर्य है कि क्या यह प्राप्त करने योग्य भी है क्योंकि मैं 2 दिनों से बिना किसी किस्मत और एक अरब संभावित रीडिंग के लिए खोज रहा हूं।

0
Vahagn 18 मार्च 2020, 10:47
आप अपने निर्माण के होने की उम्मीद कहाँ कर रहे हैं?
 – 
Alan Birtles
18 मार्च 2020, 10:51
जहां भी जीथब क्रियाएं सामान्य रूप से चलती हैं। वर्कफ़्लो धावक, मुझे लगता है कि उन्हें बुलाया जाता है।
 – 
Vahagn
18 मार्च 2020, 10:55
क्या आपने jobs.<job_id>.container का उपयोग करने का प्रयास किया? रेफरी: help.github.com/en/ क्रिया/संदर्भ/…
 – 
Mizux
22 मार्च 2020, 15:32

1 उत्तर

सबसे बढ़िया उत्तर

डोकर का उपयोग करके नियंत्रित निर्माण पर मेरे 2 सेंट (अधिक एक टिप्पणी)।
स्वचालित विलय के लिए, मुझे नहीं पता क्योंकि मैं इसके खिलाफ रहूंगा क्योंकि कोड समीक्षा को सीआई द्वारा केवल आईएमएचओ द्वारा प्रतिस्थापित नहीं किया जा सकता है ...

https://github.com/Mizux/cmake-cpp पर एक नज़र डालें

परिचय

मैं ऑर्केस्ट्रेशन के लिए मेकफ़ाइल का उपयोग करता हूं (डॉकर कमांड बहुत लंबा हो सकता है;)) और विभिन्न डिस्ट्रो पर पृथक निर्माण के लिए डॉकर।

समर्थक:

  • स्थानीय रूप से परीक्षण करने में सक्षम हो (डॉकर और मेक के साथ बस एक GNU / Linux डिस्ट्रो की आवश्यकता है)
  • विभिन्न सीआई धावक प्रदाता (ट्रैविस-सीआई, गिटहब वर्कफ़्लो, गिटलैब-रनर, बिटबकेट?)
  • पीआर भेजने से पहले योगदानकर्ता स्थानीय स्तर पर परीक्षण कर सकते हैं

दोष:

  • जीथब से कम युग्मित -> बनाए रखने के लिए अधिक जटिल।
  • वर्कफ़्लो के बीच कैश रखना अधिक कठिन है

नोट: डॉकरफाइल को ci/docker में भंडार में संग्रहीत किया जाता है, अर्थात मैं पहले चरणों में छवियों का पुनर्निर्माण करता हूं, लेकिन यदि आपकी छवि डॉकर हब पर स्थित है, तो आपको इस चरण को एक साधारण docker load से बदलने में सक्षम होना चाहिए। परीक्षण किया गया)

सेट अप

डॉकरफाइल

मैंने अपने डॉकरफाइल को कई चरणों में विभाजित किया (ज्यादातर डीबग के लिए)।

ध्यान दें: आप ubuntu:rolling को अपनी छवि से बदल सकते हैं...

सीआई/डॉकर/उबंटू/डॉकरफाइल:

# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/ubuntu
FROM ubuntu:rolling AS env
LABEL maintainer="mizux.dev@gmail.com"
# Install system build dependencies
# note: here we use the CMake package provided by Ubuntu
# see: https://repology.org/project/cmake/versions
ENV PATH=/usr/local/bin:$PATH
RUN apt-get update -q && \
apt-get install -yq git build-essential cmake && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

CMD [ "/bin/sh" ]

# Add the library src to our build env
FROM env AS devel
# Create lib directory
WORKDIR /home/lib
# Bundle lib source
COPY . .

# Build in an other stage
FROM devel AS build
# CMake configure
RUN cmake -H. -Bbuild
# CMake build
RUN cmake --build build --target all
# CMake install
RUN cmake --build build --target install

# Create an install image to check cmake install config
FROM env AS install
# Copy lib from build to install
COPY --from=build /usr/local /usr/local/
# Copy  sample
WORKDIR /home/sample
COPY ci/sample .

धावक नौकरियां

जीथब एक्शन रनर में डॉकटर स्थापित है।

नोट: आपके पास प्रति yml फ़ाइल में एक बैज हो सकता है। जैसे आपको प्रति डिस्ट्रो में एक नौकरी का उपयोग करना चाहिए, उदाहरण के लिए प्रति डिस्ट्रो में एक नौकरी या Release के लिए एक फ़ाइल और Debug के लिए एक फ़ाइल...

.github/workflows/docker.yml:

name: C++ CI

on: [push, pull_request]

jobs:
  build-docker:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build env image
      run: docker build --target=env --tag project:env -f ci/docker/ubuntu/Dockerfile . 
    - name: Build devel image
      run: docker build --target=devel --tag project:devel -f ci/docker/ubuntu/Dockerfile .
    - name: Build build image
      run: docker build --target=build --tag project:build -f ci/docker/ubuntu/Dockerfile .

परीक्षण के लिए आप एक अन्य चरण जोड़ सकते हैं या इसे project:build छवि का उपयोग करके चला सकते हैं:

docker run --rm --init -t --name test project:build cmake --build build --target test

उपभवन

तेज़ निर्माण

आप अनावश्यक फ़ाइलों को हटाने के लिए एक .dockerignore फ़ाइल जोड़ सकते हैं (जैसे LICENCES, doc, स्थानीय बिल्ड dir यदि स्थानीय रूप से परीक्षण कर रहे हैं...) docker संदर्भ को कम करने के लिए और COPY . .

.dockerignore:

# Project Files unneeded by docker
ci/cache
ci/docker
ci/Makefile
.git
.gitignore
.github
.dockerignore
.travis.yml
.appveyor.yml
.clang-format
AUTHORS
CONTRIBUTING.md
CONTRIBUTHORS
INSTALL
LICENSE
README.md
doc

# Native CMake build
build/

# Editor directories and files
*.user
*.swp

कस्टम सीएमके संस्करण स्थापित करें

आप apt install -y cmake के बजाय निम्न का उपयोग कर सकते हैं

सीएमके के पुनर्निर्माण के बाद से समय लग सकता है ...

# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4.tar.gz" \
&& tar xzf cmake-3.16.4.tar.gz \
&& rm cmake-3.16.4.tar.gz \
&& cd cmake-3.16.4 \
&& ./bootstrap --prefix=/usr/local/ \
&& make \
&& make install \
&& cd .. \
&& rm -rf cmake-3.16.4

तो आप इसके बजाय प्रीबिल्ड संस्करण का उपयोग कर सकते हैं:

# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4-Linux-x86_64.sh" \
&& chmod a+x cmake-3.16.4-Linux-x86_64.sh \
&& ./cmake-3.16.4-Linux-x86_64.sh --prefix=/usr/local/ --skip-license \
&& rm cmake-3.16.4-Linux-x86_64.sh
1
Mizux 22 मार्च 2020, 14:36
धन्यवाद, उत्तर के लिए @Mizux, मैं इसे सोमवार को आज़मा दूंगा। इस बीच, मुझे एहसास हुआ कि बिटबकेट इसे बॉक्स से बाहर करने की इजाजत देता है, हालांकि, असफल निर्माण/परीक्षण पर विलय को रोकना एक भुगतान सुविधा है। :)))) स्वचालित विलय के संबंध में, जाहिर है, पीआर को कोड समीक्षा द्वारा भी संरक्षित किया जाना चाहिए। मैंने बस उस हिस्से को छोड़ दिया क्योंकि मुझे लगा कि इसे स्थापित करना आसान है।
 – 
Vahagn
21 मार्च 2020, 12:01