Skip to content

Instantly share code, notes, and snippets.

@NickTikhomirov
Last active May 26, 2019 20:32
Show Gist options
  • Save NickTikhomirov/8723f0abe0437102707e26d3c4f461a6 to your computer and use it in GitHub Desktop.
Save NickTikhomirov/8723f0abe0437102707e26d3c4f461a6 to your computer and use it in GitHub Desktop.
lab06

Laboratory work VI

Данная лабораторная работа посвещена изучению средств пакетирования на примере CPack

$ open https://cmake.org/Wiki/CMake:CPackPackageGenerators

Tasks

  • 1. Создать публичный репозиторий с названием lab06 на сервисе GitHub
  • 2. Выполнить инструкцию учебного материала
  • 3. Ознакомиться со ссылками учебного материала
  • 4. Составить отчет и отправить ссылку личным сообщением в Slack

Tutorial

Устанавливаем значения соотвествующих переменных

#Установка значения переменной
$ export GITHUB_USERNAME=<имя_пользователя>
#Установка значения переменной
$ export GITHUB_EMAIL=nicktikhomirov02@gmail.com
#Устанавливаем функционал для команды edit
$ alias edit=nano
#Устанавливаем функционал для команды gsed
$ alias gsed=sed # for *-nix system

Подготовка рабочего пространства

#Переходим в рабочую директорию (у меня она в другом месте расположена, поэтому команда отличается - см. вывод pushd .)
$ cd ${GITHUB_USERNAME}/workspace
#Вывод текущей директории
$ pushd .
/mnt/c/workspace
#Запуск макроса
$ source scripts/activate

Скачиваем лабораторную работу 05, чтобы на её основе сделать лабораторную работу 06

#Непосредственно скачивание
$ git clone https://github.com/${GITHUB_USERNAME}/lab05 projects/lab06
Cloning into 'projects/lab06'...
remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 36 (delta 8), reused 32 (delta 7), pack-reused 0
Unpacking objects: 100% (36/36), done.
#Переходим в директорию с лабораторной
$ cd projects/lab06
#Отвязываем ссылку на исходный гит
$ git remote remove origin
#Привязываем ссылку на новый гит (созданный вручную)
$ git remote add origin https://github.com/${GITHUB_USERNAME}/lab06

Редактируем CMakeLists.txt -> Переменные с версиями

#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION_STRING "v${PRINT_VERSION}")
' CMakeLists.txt
#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION\
  \${PRINT_VERSION_MAJOR}.\${PRINT_VERSION_MINOR}.\${PRINT_VERSION_PATCH}.\${PRINT_VERSION_TWEAK})
' CMakeLists.txt
#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION_TWEAK 0)
' CMakeLists.txt
#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION_PATCH 0)
' CMakeLists.txt
#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION_MINOR 1)
' CMakeLists.txt
#Дописываем эту строку в файл проекта "print"
$ gsed -i '/project(print)/a\
set(PRINT_VERSION_MAJOR 0)
' CMakeLists.txt
#Смотрим, чем отличается наш гит от лежащего на гитхабе
$ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 05cc72b..e62bf3f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,13 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 option(BUILD_EXAMPLES "Build examples" OFF)

 project(print)
+set(PRINT_VERSION_MAJOR 0)
+set(PRINT_VERSION_MINOR 1)
+set(PRINT_VERSION_PATCH 0)
+set(PRINT_VERSION_TWEAK 0)
+set(PRINT_VERSION
+  ${PRINT_VERSION_MAJOR}.${PRINT_VERSION_MINOR}.${PRINT_VERSION_PATCH}.${PRINT_VERSION_TWEAK})
+set(PRINT_VERSION_STRING "v${PRINT_VERSION}")

 add_library(print STATIC ${CMAKE_CURRENT_SOURCE_DIR}/sources/print.cpp)


~
~
~
~
~
~
~
~
~
~

Создаем некоторые нужные файлы

#Создали DESCRIPTION и отредактировали его
$ touch DESCRIPTION && edit DESCRIPTION
#Создали ChangeLog.md
$ touch ChangeLog.md
#Создали переменную DATE и заполнили ее значением
$ export DATE="`LANG=en_US date +'%a %b %d %Y'`"
#Пишем в файл ChangeLog.md
$ cat > ChangeLog.md <<EOF
* ${DATE} ${GITHUB_USERNAME} <${GITHUB_EMAIL}> 0.1.0.0
- Initial RPM release
EOF

Создаём CMake-файл с конфигурацией

#Пишем в файл текст
$ cat > CPackConfig.cmake <<EOF
include(InstallRequiredSystemLibraries)
EOF

Дописываем в файл данные по версиям, обратной связи и описаниям

#Пишем в файл текст
$ cat >> CPackConfig.cmake <<EOF
set(CPACK_PACKAGE_CONTACT ${GITHUB_EMAIL})
set(CPACK_PACKAGE_VERSION_MAJOR \${PRINT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR \${PRINT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH \${PRINT_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION_TWEAK \${PRINT_VERSION_TWEAK})
set(CPACK_PACKAGE_VERSION \${PRINT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_FILE \${CMAKE_CURRENT_SOURCE_DIR}/DESCRIPTION)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "static c++ library for printing")
EOF

Пишем в файл данные по лицензии и Readme

#Пишем в файл текст
$ cat >> CPackConfig.cmake <<EOF

set(CPACK_RESOURCE_FILE_LICENSE \${CMAKE_CURRENT_SOURCE_DIR}/LICENSE)
set(CPACK_RESOURCE_FILE_README \${CMAKE_CURRENT_SOURCE_DIR}/README.md)
EOF

Пишем в файл данные по RPM

#Пишем в файл текст
$ cat >> CPackConfig.cmake <<EOF

set(CPACK_RPM_PACKAGE_NAME "print-devel")
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
set(CPACK_RPM_PACKAGE_GROUP "print")
set(CPACK_RPM_CHANGELOG_FILE \${CMAKE_CURRENT_SOURCE_DIR}/ChangeLog.md)
set(CPACK_RPM_PACKAGE_RELEASE 1)
EOF

Пишем информацию по Debian

#Пишем в файл текст
$ cat >> CPackConfig.cmake <<EOF

set(CPACK_DEBIAN_PACKAGE_NAME "libprint-dev")
set(CPACK_DEBIAN_PACKAGE_PREDEPENDS "cmake >= 3.0")
set(CPACK_DEBIAN_PACKAGE_RELEASE 1)
EOF

Добавляем CPack в файл конфигов

#Пишем в файл текст
$ cat >> CPackConfig.cmake <<EOF

include(CPack)
EOF

Пишем в главный файл CMakeLists.txt данные о созданном нами файле

#Пишем в файл текст
$ cat >> CMakeLists.txt <<EOF

include(CPackConfig.cmake)
EOF

Редактируем README.md

#Заменяем строку
$ gsed -i 's/lab05/lab06/g' README.md

Фиксируем, отправляем

#Фиксируем изменения
$ git add .
#Коммитим изменения
$ git commit -m"added cpack config"
[master 8a5e3b0] added cpack config
 5 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 CPackConfig.cmake
 create mode 100644 ChangeLog.md
 create mode 100644 DESCRIPTION
#Ставим тэг
$ git tag v0.1.0.0
#Отправляем изменения
$ git push origin master --tags
Username for 'https://github.com': nicktikhomirov02@gmail.com
Password for 'https://nicktikhomirov02@gmail.com@github.com':
Enumerating objects: 43, done.
Counting objects: 100% (43/43), done.
Delta compression using up to 4 threads
Compressing objects: 100% (33/33), done.
Writing objects: 100% (43/43), 6.12 KiB | 216.00 KiB/s, done.
Total 43 (delta 10), reused 0 (delta 0)
remote: Resolving deltas: 100% (10/10), done.
To https://github.com/NickTikhomirov/lab06
 * [new branch]      master -> master
 * [new tag]         v0.1.0.0 -> v0.1.0.0

Включили репозиторий в Travis CI

#Зашли сами
$ travis login --auto
We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.

Try running with --github-token or --auto if you don't want to enter your password anyway.

Username: nicktikhomirov02@gmail.com
Password for nicktikhomirov02@gmail.com: ***********
Successfully logged in as NickTikhomirov!
#Включили поддержку репозитория
$ travis enable
Detected repository as NickTikhomirov/lab06, is this correct? |yes| y
NickTikhomirov/lab06: enabled :)

Сборка и компиляция (CMake), создание пакета через CPack

#Сборка (берём CMakeLists.txt из текущей директории, результат в директорию _build)
$ cmake -H. -B_build
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/c/workspace/projects/lab06/_build
#Компиляция
$ cmake --build _build
Scanning dependencies of target print
[ 50%] Building CXX object CMakeFiles/print.dir/sources/print.cpp.o
[100%] Linking CXX static library libprint.a
[100%] Built target print
#Заходим в директорию _build
$ cd _build
#Упаковываем с помощью CPack
$ cpack -G "TGZ"
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: print
CPack: - Install project: print
CPack: Create package
CPack: - package: /mnt/c/workspace/projects/lab06/_build/print-0.1.0.0-Linux.tar.gz generated.
#Выходим из директории
$ cd ..

Сборка и создание пакета с помощью CMake

#Сборка
$ cmake -H. -B_build -DCPACK_GENERATOR="TGZ"
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/c/workspace/projects/lab06/_build
#Компилируем package
$ cmake --build _build --target package
[100%] Built target print
Run CPack packaging tool...
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: print
CPack: - Install project: print
CPack: Create package
CPack: - package: /mnt/c/workspace/projects/lab06/_build/print-0.1.0.0-Linux.tar.gz generated.

Перемещение пакета в директорию, которую мы тут же создаём

#Создаём директорию artifacts
$ mkdir artifacts
#Переносим в неё пакет
$ mv _build/*.tar.gz artifacts
#Смотрим дерево директории artifacts
$ tree artifacts
artifacts
└── print-0.1.0.0-Linux.tar.gz

0 directories, 1 file

Report

$ popd
$ export LAB_NUMBER=06
$ git clone https://github.com/tp-labs/lab${LAB_NUMBER} tasks/lab${LAB_NUMBER}
$ mkdir reports/lab${LAB_NUMBER}
$ cp tasks/lab${LAB_NUMBER}/README.md reports/lab${LAB_NUMBER}/REPORT.md
$ cd reports/lab${LAB_NUMBER}
$ edit REPORT.md
$ gistup -m "lab${LAB_NUMBER}"

Homework

После того, как вы настроили взаимодействие с системой непрерывной интеграции,
обеспечив автоматическую сборку и тестирование ваших изменений, стоит задуматься
о создание пакетов для измениний, которые помечаются тэгами (см. вкладку releases).
Пакет должен содержать приложение solver из предыдущего задания Таким образом, каждый новый релиз будет состоять из следующих компонентов:

  • архивы с файлами исходного кода (.tar.gz, .zip)
  • пакеты с бинарным файлом solver (.deb, .rpm, .msi, .dmg)

В качестве подсказки:

$ cat .travis.yml
os: osx
script:
...
- cpack -G DragNDrop # dmg

$ cat .travis.yml
os: linux
script:
...
- cpack -G DEB # deb

$ cat .travis.yml
os: linux
addons:
  apt:
    packages:
    - rpm
script:
...
- cpack -G RPM # rpm

$ cat appveyor.yml
platform:
- x86
- x64
build_script:
...
- cpack -G WIX # msi

Для этого нужно добавить ветвление в конфигурационные файлы для CI со следующей логикой:
если commit помечен тэгом, то необходимо собрать пакеты (DEB, RPM, WIX, DragNDrop, ...)
и разместить их на сервисе GitHub. (см. пример для Travi CI)

Links

Copyright (c) 2015-2019 The ISC Authors
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment