Menggunakan Docker untuk Membangun dan Menjalankan Proyek C ++

Posting ini akan berbicara tentang bagaimana membangun proyek C ++ menggunakan GTest dan Meningkatkan menggunakan Docker. Artikel ini adalah resep dengan beberapa komentar penjelas, solusi yang disajikan dalam artikel tersebut tidak berpura-pura siap untuk diproduksi.


Mengapa dan siapa yang mungkin membutuhkannya?


Misalkan Anda, seperti saya, benar-benar menyukai konsep Python venv , ketika semua dependensi yang diperlukan berada di direktori terpisah, yang didefinisikan secara ketat; atau Anda perlu memberikan portabilitas sederhana dari lingkungan perakitan dan pengujian untuk proyek yang sedang dikembangkan, yang sangat nyaman, misalnya, ketika bergabung dengan pengembang baru ke tim.


Artikel ini akan sangat berguna bagi pengembang pemula yang perlu melakukan pengaturan lingkungan dasar untuk membangun dan menjalankan proyek C ++.


Lingkungan yang disajikan dalam artikel dapat digunakan sebagai kerangka kerja untuk tugas uji atau pekerjaan laboratorium.


Instal Docker


Yang Anda butuhkan untuk mengimplementasikan proyek yang disajikan dalam artikel ini adalah Docker dan akses Internet.


Docker tersedia untuk platform Windows, Linux, dan Mac. Dokumentasi resmi .


Karena saya menggunakan mesin Windows di papan, saya hanya perlu mengunduh installer dan menjalankannya.


Harap dicatat bahwa saat ini, Docker untuk Windows menggunakan Hyper-V untuk pekerjaannya.


Proyek


Sebagai proyek, kami akan berarti aplikasi CommandLine yang menampilkan string "Hello World!" ke aliran output standar.


Proyek ini akan menggunakan perpustakaan minimum yang diperlukan, serta CMake sebagai sistem pembangunan.


Struktur proyek kami adalah sebagai berikut:


project | Dockerfile | \---src CMakeLists.txt main.cpp sample_hello_world.h test.cpp 

File CMakeLists.txt berisi deskripsi proyek.
Kode sumber file:


 cmake_minimum_required(VERSION 3.2) project(HelloWorldProject) #  C++17 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") #  Boost.Program_options #   ,     set(Boost_USE_STATIC_LIBS ON) find_package(Boost COMPONENTS program_options REQUIRED) include_directories(${BOOST_INCLUDE_DIRS}) #     add_executable(hello_world_app main.cpp sample_hello_world.h) target_link_libraries(hello_world_app ${Boost_LIBRARIES}) #  CTest enable_testing() #       GoogleTest find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) #    add_executable(hello_world_test test.cpp sample_hello_world.h) target_link_libraries(hello_world_test ${GTEST_LIBRARIES} pthread) #       CTest add_test(NAME HelloWorldTest COMMAND hello_world_test) 

File sample_hello_world.h berisi deskripsi kelas HelloWorld, mengirimkan instance yang ke stream, string "Hello World!" Akan ditampilkan. Kompleksitas ini disebabkan oleh kebutuhan untuk menguji kode aplikasi kita.
Kode sumber file:


 #ifndef SAMPLE_HELLO_WORLD_H #define SAMPLE_HELLO_WORLD_H namespace sample { struct HelloWorld { template<class OS> friend OS& operator<<(OS& os, const HelloWorld&) { os << "Hello World!"; return os; } }; } // sample #endif // SAMPLE_HELLO_WORLD_H 

File main.cpp berisi titik masuk aplikasi kita, kita juga akan menambahkan Boost.Program_options untuk mensimulasikan proyek nyata.


Kode sumber file:


 #include "sample_hello_world.h" #include <boost/program_options.hpp> #include <iostream> //         - "--help" auto parseArgs(int argc, char* argv[]) { namespace po = boost::program_options; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "Produce this message"); auto parsed = po::command_line_parser(argc, argv) .options(desc) .allow_unregistered() .run(); po::variables_map vm; po::store(parsed, vm); po::notify(vm); //  C++17     std::make_pair return std::pair(vm, desc); } int main(int argc, char* argv[]) try { auto [vm, desc] = parseArgs(argc, argv); if (vm.count("help")) { std::cout << desc << std::endl; return 0; } std::cout << sample::HelloWorld{} << std::endl; return 0; } catch (std::exception& e) { std::cerr << "Unhandled exception: " << e.what() << std::endl; return -1; } 

File test.cpp berisi minimum yang diperlukan - tes fungsionalitas kelas HelloWorld. Untuk pengujian kami menggunakan GoogleTest .
Kode sumber file:


 #include "sample_hello_world.h" #include <sstream> #include <gtest/gtest.h> //  ,  HelloWorld  ,     TEST(HelloWorld, Test) { std::ostringstream oss; oss << sample::HelloWorld{}; ASSERT_EQ("Hello World!", oss.str()); } //      int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } 

Selanjutnya, mari kita beralih ke bagian yang paling menarik - mengatur lingkungan build Anda menggunakan Dockerfile!


Dockerfile


Untuk perakitan, kami akan menggunakan gcc versi terbaru.
Dockerfile berisi dua tahap: membangun dan meluncurkan aplikasi kami.
Untuk menjalankan, gunakan versi terbaru Ubuntu.


Konten Dockerfile:


 #  --------------------------------------- #        gcc:latest FROM gcc:latest as build #      GoogleTest WORKDIR /gtest_build #        GoogleTest #     ,  # Docker   RUN   , #   ,   ,   RUN apt-get update && \ apt-get install -y \ libboost-dev libboost-program-options-dev \ libgtest-dev \ cmake \ && \ cmake -DCMAKE_BUILD_TYPE=Release /usr/src/gtest && \ cmake --build . && \ mv lib*.a /usr/lib #   /src   ADD ./src /app/src #       WORKDIR /app/build #    ,     RUN cmake ../src && \ cmake --build . && \ CTEST_OUTPUT_ON_FAILURE=TRUE cmake --build . --target test #  --------------------------------------- #      ubuntu:latest FROM ubuntu:latest #  ,    Docker    root #     root'  :) RUN groupadd -r sample && useradd -r -g sample sample USER sample #      WORKDIR /app #         COPY --from=build /app/build/hello_world_app . #    ENTRYPOINT ["./hello_world_app"] 

Saya kira untuk saat ini, lanjutkan untuk membangun dan menjalankan aplikasi!


Perakitan dan peluncuran


Untuk membangun aplikasi kami dan membuat gambar Docker, cukup menjalankan perintah berikut:


 #  docker-cpp-sample    # . -    ,  Dockerfile docker build -t docker-cpp-sample . 

Untuk memulai aplikasi, gunakan perintah:


 > docker run docker-cpp-sample 

Kita akan melihat kata-kata yang berharga:


 Hello World! 

Untuk melewatkan parameter, cukup menambahkannya ke perintah di atas:


 > docker run docker-cpp-sample --help Allowed options: -h [ --help ] Produce this message 

Untuk meringkas


Sebagai hasilnya, kami membuat aplikasi C ++ lengkap, mengkonfigurasi lingkungan untuk membangun dan menjalankannya di Linux, dan membungkusnya dalam wadah Docker. Dengan demikian, membebaskan pengembang berikutnya dari kebutuhan untuk menghabiskan waktu menyiapkan perakitan lokal.

Source: https://habr.com/ru/post/id414109/


All Articles