Автоматическое тестирование и развертывание Travis-CI на вашем собственном сервере CentOS

внешний интерфейс сервер SSH модульный тест
Автоматическое тестирование и развертывание Travis-CI на вашем собственном сервере CentOS

Я всегда хотел самостоятельно развертывать автоматические тестовые развертывания, после пониманияTravis-CIПосле этого я, наконец, приготовился к эксперименту на сайте блога с моими друзьями на этот раз.

Поскольку это проект с отдельными интерфейсом и серверной частью, я сосредоточился только на автоматическом развертывании интерфейсных проектов, а интерфейс — это в основном одностраничное приложение, созданное с помощью шаблонов Vue.

Приготовление окружающей среды

  • Открытый проект Github (Трэвис напроект с открытым исходным кодомбесплатно, дачастный проектвзимается)
  • Сервер Linux (учебный компьютер Tencent Cloud, который я использую здесь, системаCentOS 7.0)
  • клеммный разъем (я использовалSecureCRT, скачать и установить самому, конечно можно использовать и XShell и т.п., в основном для подключения к серверу)

Автоматизируйте процесс развертывания

  1. Измените код локально и отправьте его в указанную ветку
  2. Трэвис прослушивает изменения в репозитории
  3. Казнь Трэвисаinstallа такжеscriptЗадачи (здесь вы можете сделать некоторые зависимости и команды тестовой сборки для установки задач тестовой сборки)
  4. После успешного выполнения задачи в Travisafter_successвнутри крючкаssh вход без паролясервер
  5. Автоматически выполнять настроенные скрипты на сервере
  6. Полное автоматическое развертывание

Конфигурация проекта Трэвис

1. Создайте репозиторий Github и инициализируйте проект

Создайте общедоступный репозиторий на Github. Извлеките репозиторий локально (моя машина с Windows) и используйтеvue-cliИнициализировать vue одностраничное приложение (на самом деле инициализация одностраничного приложения для этой операции не нужна, т.к. я vue проект, поэтому сначала создайте новое, а потом будет удобнее при тестировании и деплое. Конечно, вы также можете инициализировать некоторые другие вещи, но позже необходимо изменить установку и скрипт на соответствующие команды).

моя цель -Travis автоматически развертывается только тогда, когда в главной ветке есть push, обычно код разработки отправляется вdevФилиал, фича разрабатывается, а потом упоминается другаяPR(Pull Request)Слияние с мастером, так что вот первая новая ветка в базе master dev. Конечно, этот тест не должен всегда идти на слияние с dev на master, это слишком много мороки, поэтому мыРаботайте непосредственно на главной ветке.

Отправьте код для загрузки на сервер.

2. Активировать склад

Войти с учетной записью GithubTravis-CI. Travis-CI синхронизирует всю информацию о репозитории на вашем Github.

После входа в систему будут перечислены все ваши репозитории:

Серый крест означает, что хранилище не активировано.Выберите хранилище, для которого требуется автоматизировать развертывание, и включите переключатель, чтобы активировать хранилище. Мой lzq4047/blog-front — это хранилище, которое я хочу автоматизировать на этот раз.

3. Добавьте файл конфигурации Travis

проект локальноКорневая директорияизmasterдобавить в ветку.travis.ymlконфигурационный файл

Добавьте следующую конфигурацию:

# .travis.yml
language: node_js   #前端工程所以是JavaScript,编译环境是node_js
node_js:
- '8'   #指定node版本
branchs:
  only:
  - master  #指定只有检测到master分支有变动时才执行任务

Отправьте файл конфигурации на сервер. Вернитесь на сайт Трэвиса В это время Трэвис обнаружил изменения в хранилище (может немного задержаться), поэтому запустит задачу согласно конфигурационному файлу .travis.yml в корневом каталоге хранилища.

Верхняя часть — это информация о задаче, а следующая — результат выполнения задачи. ты сможешьView configВы можете увидеть информацию о конфигурации этой задачи на вкладке .travis, включая информацию, которую вы настроили в .travis.yml, и автоматическую настройку Travis.

В этот момент Трэвис отслеживает изменения склада, и задача автоматического выполнения завершена, то есть первые три шага в процессе выполнены.

Трэвис использует SSH для входа на сервер без пароля

В шагах, предшествующих этому, в принципе нет проблем, в Интернете есть много очень хороших руководств, и ям в принципе нет. Однако в процессе использования SSH для входа на сервер Linux без пароля возникает много проблем.

Для того, чтобы выполнить скрипт на сервере через Travis, мы должны сначала авторизоваться на нашем сервере, но Travis не похож на интерактивный терминал. Как правило, вход с логином и паролем требует ввода логина и пароля, но Travis не предоставляет интерфейс для взаимодействия с пользователями, конечно, это не соответствует автоматизации, поэтому мы можем войти только другими способами--Вход без пароля через SSH.

Вы можете увидеть принцип входа по SSH:Принцип входа с открытым ключом SSH. Общий процесс заключается в создании пары открытого/закрытого ключа на стороне клиента и сохранении содержимого открытого ключа на сервере.~/.ssh/authrized_keysЗатем, когда клиент инициирует запрос на соединение, сервер отправляет строку клиенту, клиент шифрует строку локальным закрытым ключом и отправляет ее на сервер, а сервер расшифровывает полученную зашифрованную строку открытым ключом, если расшифровка успешна, логин успешен.

Пара открытый ключ/закрытый ключ здесь является ключом для входа в систему. Мы не можем напрямую управлять сервером Travis и генерировать на нем пару открытый ключ/закрытый ключ, поэтому обычный процесс, описанный выше, не будет работать. В настоящее время нам нужно замаскировать Трэвиса под доверенного клиента для подключения. То есть нам нужно иметь пару открытый/закрытый ключи.Открытый ключ хранится на нашем Linux-сервере, а закрытый ключ хранится в месте, к которому Трэвис может получить доступ.Используйте этот закрытый ключ для подключения к серверу, когда необходимо, здесь Мы можем поместить закрытый ключ в репозиторий кода Git, но помещать закрытый ключ прямо в код небезопасно, поэтому в Travis предусмотрена функция шифрования закрытого ключа.Мы можем зашифровать закрытый ключ и положить его в репозитории кода, когда Трэвис расшифровывает закрытый ключ для соединения.

Поймите общий принцип, следующим шагом будет конкретная операция.

Сгенерировать пару открытый/закрытый ключ

Здесь ключевая пара генерируется непосредственно на сервере.Теоретически ключевую пару можно сгенерировать где угодно, лишь бы она совпадала.

Используйте инструмент для подключения терминала (SecureCRT) для входа на сервер я создал здесь пользователя специально для подключения Трэвиса.

существуетrootСоздайте нового пользователя travis под пользователем

#新建用户
useradd travis
#修改密码(应该不是必要,但是万一以后需要用密码登陆呢),按照提示设置密码。
passwd travis
#为用户添加添加权限
vim /etc/sudoers

Найдите комментарий #Разрешить root выполнять любые команды в любом месте и добавьте новую строку ниже:

travis  ALL=(ALL)   ALL

Создать пару ключей

  • Не забудьте перейти к пользователю travis
  • passphase должен быть пустым
#切换至用户travis,注意后面的操作都在该用户下操作,不然从git上面拉下来的代码或者生成的文件拥有着将不是travis,会造成一些麻烦
[root@VM_156_69_centos ~]# su travis
[travis@VM_156_69_centos root]$ cd ~
# 生成RSA密钥对,后面所有的直接以默认就行,passphase一定要为空
[travis@VM_156_69_centos ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/travis/.ssh/id_rsa): 
Created directory '/home/travis/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/travis/.ssh/id_rsa.
Your public key has been saved in /home/travis/.ssh/id_rsa.pub.
The key fingerprint is:
8b:1f:5b:c5:b8:e2:09:21:0a:f8:6d:ef:5f:25:84:24 travis@VM_156_69_centos
The key's randomart image is:
+--[ RSA 2048]----+
|      E .        |
|       o .       |
|        . .      |
|.        . o     |
|o   . . S o +    |
| o o . o . =     |
|  o o o + +      |
|   . . + B       |
|     .o.*        |
+-----------------+

Вы можете видеть, что сгенерированная пара ключей находится в папке .ssh домашнего каталога пользователя (/home/travis/.ssh)под. Из-за правил контроля разрешений Linux разрешения файлов не настолько велики, насколько это возможно, и для всех необходимо установить соответствующие разрешения. Здесь вам нужно установить для каталога **.ssh права доступа 700, а для файлов в каталоге .sshm= — права доступа 600**.

#设置.ssh目录为700
[travis@VM_156_69_centos ~]$ chmod 700 ~/.ssh/
#设置.ssh目录下的文件为600
[travis@VM_156_69_centos ~]$ chmod 600 ~/.ssh/*
#可以看到下面的所有目录和文件所用者都是travis这个用户
[travis@VM_156_69_centos ~]$ ls -al
total 28
drwx------  3 travis travis 4096 Mar  6 20:12 .
drwxr-xr-x. 5 root   root   4096 Mar  6 20:03 ..
drwx------  2 travis travis 4096 Mar  6 20:12 .ssh
[travis@VM_156_69_centos ~]$ ls ~/.ssh/ -al
total 16
drwx------ 2 travis travis 4096 Mar  6 20:12 .
drwx------ 3 travis travis 4096 Mar  6 20:12 ..
-rw------- 1 travis travis 1675 Mar  6 20:12 id_rsa
-rw------- 1 travis travis  405 Mar  6 20:12 id_rsa.pub

Добавьте сгенерированный открытый ключ в список доверенных лиц (выделение)

[travis@VM_156_69_centos ~]$ cd .ssh/
#将公钥内容输出到authorized_keys中
[travis@VM_156_69_centos .ssh]$ cat id_rsa.pub >> authorized_keys
[travis@VM_156_69_centos .ssh]$ cat authorized_keys 
# authorized_keys文件内容类似这样
ssh-rsa  *************centos

Тестовый SSH-вход

#在.ssh目录下新增配置文件config
[travis@VM_156_69_centos .ssh]$ vim config
#添加下面代码段中的内容并保存
#测试连接
[travis@VM_156_69_centos .ssh]$ ssh test
Bad owner or permissions on /home/travis/.ssh/config
#注意此时的测试是失败的,因为authorized_keys和config是我们后面添加的文件,文件权限并不是600
[travis@VM_156_69_centos .ssh]$ ls -al
total 28
drwx------ 2 travis travis 4096 Mar  6 20:40 .
drwx------ 3 travis travis 4096 Mar  6 20:38 ..
-rw-rw-r-- 1 travis travis  405 Mar  6 20:40 authorized_keys
-rw-rw-r-- 1 travis travis   91 Mar  6 20:38 config
-rw------- 1 travis travis 1675 Mar  6 20:12 id_rsa
-rw------- 1 travis travis  405 Mar  6 20:12 id_rsa.pub
#修改文件权限
[travis@VM_156_69_centos .ssh]$ chmod 600 config 
[travis@VM_156_69_centos .ssh]$ chmod 600 authorized_keys 
#查看修改后的权限
[travis@VM_156_69_centos .ssh]$ ls -al
total 28
drwx------ 2 travis travis 4096 Mar  6 20:40 .
drwx------ 3 travis travis 4096 Mar  6 20:38 ..
-rw------- 1 travis travis  405 Mar  6 20:40 authorized_keys
-rw------- 1 travis travis   91 Mar  6 20:38 config
-rw------- 1 travis travis 1675 Mar  6 20:12 id_rsa
-rw------- 1 travis travis  405 Mar  6 20:12 id_rsa.pub
#重新执行测试
[travis@VM_156_69_centos .ssh]$ ssh test 
The authenticity of host '139.199.90.74 (139.199.90.74)' can't be established.
ECDSA key fingerprint is 41:39:50:e1:e7:c2:f5:19:86:dc:70:e5:91:42:bb:56.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '139.199.90.74' (ECDSA) to the list of known hosts.
Last login: Tue Mar  6 20:43:32 2018 from 139.199.90.74
#测试成功,生成了一个known_hosts文件,以后再登陆时就不需要在输入yes确认了,你可以再做一次测试
[travis@VM_156_69_centos ~]$ ls .ssh/
authorized_keys  config  id_rsa  id_rsa.pub  known_hosts

содержимое конфигурационного файла:

Host test
HostName 99.99.99.99(你的服务器ip)
#登陆的用户名
User travis
IdentitiesOnly yes
#登陆使用的密钥
IdentityFile ~/.ssh/id_rsa

Установите Travis Client Tool на сервер Linux

Клиентские инструменты Travis должны быть установлены с драгоценными камнями,gemЭто инструмент управления для ruby, поэтому сначала установите ruby. Здесь непосредственно используется инструмент управления версиями ruby.rvm(аналогично установке узла nvm), так как rvm или автоматически собирает зависимости сервера, недостающие зависимости будут установлены автоматически. Я только начал использовать ручную установку и не хватало различных зависимостей. После долгого метания я успешно использовал rvm.

установить РВМ

Ссылаться наwww.rvm.io/

[travis@VM_156_69_centos ~]# curl -sSL https://get.rvm.io | bash -s stable
#安装完成后测试是否安装成功
[root@VM_156_69_centos ~]# rvm version
rvm 1.29.3 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]

установить рубин

#我用travis用户安装时好像有网络错误,所以就用root用户安装
[root@VM_156_69_centos ~]# rvm install ruby
#测试ruby安装
[travis@VM_156_69_centos root]$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

Изменить источник зеркала

После установки ruby ​​вы можете использовать инструмент управления пакетами gem, но кажется, что официальный источник зеркала заблокирован, поэтому вам необходимо заменить источник зеркала gem. Ссылаться наgems.ruby-china.org/

[travis@VM_156_69_centos ~]$ gem sources -l
*** CURRENT SOURCES ***

https://rubygems.org/
[travis@VM_156_69_centos ~]$ gem -v
2.6.14
#更换镜像源
[travis@VM_156_69_centos ~]$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
https://gems.ruby-china.org/ added to sources
https://rubygems.org/ removed from sources
[travis@VM_156_69_centos ~]$ gem sources -l
*** CURRENT SOURCES ***

https://gems.ruby-china.org/

Установите инструмент командной строки travis

#在travis下面提示没有权限,我切到root用户去安装
[travis@VM_156_69_centos ~]$ gem install travis
Fetching: multipart-post-2.0.0.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You dont have write permissions for the /usr/local/rvm/gems/ruby-2.4.1 directory.
#安装travis
[root@VM_156_69_centos ~]# gem install travis
Successfully installed travis-1.8.8
Parsing documentation for travis-1.8.8
Done installing documentation for travis after 1 seconds
1 gem installed
#切回travis用户,执行travis命令有以下输出说明安装成功
[travis@VM_156_69_centos root]$ travis
Shell completion not installed. Would you like to install it now? |y| y
Usage: travis COMMAND ...

Добавить зашифрованный закрытый ключ в репозиторий

Переключитесь в пользователей TRAVIS, потяните код в каталоге, введите каталог кода.Обязательно переключитесь на пользователя travis, иначе у вас не будет прав на работу с этими файлами, в результате код не может быть отправлен

Выполните следующую команду, чтобы сгенерировать зашифрованный файл закрытого ключа.

#首先用GitHub账户登陆travis
[travis@VM_156_69_centos blog-front]$ travis login
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 dont want to enter your password anyway.

Username: lzq4047
Password for lzq4047: ******
Successfully logged in as lzq4047!
#登陆成功后解密私钥,--add参数会把加密的私钥解密命令插入到.travis.yml,Travis解密时要用到的
[travis@VM_156_69_centos blog-front]$ travis encrypt-file ~/.ssh/id_rsa --add
Detected repository as lzq4047/blog-front, is this correct? |yes| yes
encrypting /home/travis/.ssh/id_rsa for lzq4047/blog-front
storing result as id_rsa.enc
#由于我之前生成过,所有这里提示是否覆盖
DANGER ZONE: Override existing id_rsa.enc? |no| yes
storing secure env variables for decryption

Make sure to add id_rsa.enc to the git repository.
Make sure not to add /home/travis/.ssh/id_rsa to the git repository.
Commit all changes to your .travis.yml.
#可以看到已经生成了加密后的私钥id_rsa.enc
[travis@VM_156_69_centos blog-front]$ ls -al
total 464
drwxrwxr-x 7 travis travis   4096 Mar  6 21:24 .
drwx------ 7 travis travis   4096 Mar  6 21:24 ..
...
-rw-rw-r-- 1 travis travis   1680 Mar  6 21:27 id_rsa.enc 
...
-rw-rw-r-- 1 travis travis   1286 Mar  6 21:27 .travis.yml
#.travis.yml中也自动添加了解密命令
[travis@VM_156_69_centos blog-front]$ cat .travis.yml 
language: node_js
node_js:
- '8'
branchs:
  only:
  - master
before_install:
- openssl aes-256-cbc -K $encrypted_****_key -iv $encrypted_****_iv
  -in id_rsa.enc -out ~/.ssh/id_rsa -d

Объясните команду расшифровки-inа также-outпараметр:

  • Параметр -in указывает файл для расшифровки, который находится в корневом каталоге хранилища (когда Трэвис выполняет задачу, он сначала загружает код на собственный сервер Трэвиса и входит в каталог обновления хранилища)
  • Параметр -out указывает ключ дешифрования после того, как Travis хранится в ~/.ssh/id_rsa сервера, если вам это понадобится позже, то вы можете выбрать этот путь, я видел в этом документе какой-то подход к онлайн-посадке SSH, используемый

Настройка хука After_suCcess

Вся предыдущая работа на самом деле заключается в подготовке к этому шагу, скрипту выполнения входа на сервер SSH без пароля.

Добавьте некоторую конфигурацию в .travis.yml, в основном конфигурацию хука after_success. Модифицированная конфигурация выглядит следующим образом:

language: node_js
node_js:
- '8'
branchs:
  only:
  - master
install:
- npm install
script:
- npm run build
env:
  global:
    secure: *********
addons:
  ssh_known_hosts:
  - 99.99.99.99 #受信主机,你的Linux服务器ip
before_install:
- openssl aes-256-cbc -K $encrypted_****_key -iv $encrypted_****_iv
  -in id_rsa.enc -out ~/.ssh/id_rsa -d
after_success:
- chmod 600 ~/.ssh/id_rsa   #还是Linux文件权限问题
- ssh blog@139.199.90.74 -o StrictHostKeyChecking=no 'cd ~/blog-front && git pull && npm install && npm run build'   #使用ssh连接服务器

Примечание: используйтеsshКомандное подключение должно быть установлено на StrictHostKeyChecking=no, в противном случае при первом подключении все равно будет запрашиваться подтверждение. Содержимое обратных кавычек — это команда, выполняемая на вашем сервере Linux после входа на сервер Linux.Вы также можете написать сценарий. Пока вы входите на сервер, он будет следовать за вами.

after_success выполняется после Трэвисаinstallа такжеscriptДля хуков, выполненных позже, другие конфигурации Travis можно найти в официальной документации. После того, как сборка здесь будет успешной, я просто соберу ее, чтобы увидеть, может ли сборка быть успешной.После успешной сборки я могу войти на сервер и выполнить сборку на сервере (конечно, я могу напрямую скопировать результат сборки Трависа в указанную директорию сервера через scp)...

последний шаг

Конечно, отправьте код и посмотрите результаты.

Зафиксируйте зашифрованный файл ключа и измененный файл .travis.yml в основной ветке, посетитеTravisОзнакомьтесь с автоматизированным процессом сборки.

Как видите, также есть ошибка npm:command not found. Моя яма не засыпана, но ключевые этапы пройдены, и позже я могу свободно играть. .

Лучшие видимые результаты:

На самом деле это путь к изображению вверху после успешного построения Travis.

Суммировать

Наконец, позвольте мне подытожить. Я пишу статью в первый раз, но точно не в последний раз (буду разбирать свой опыт после того, как недавно закончил с друзьями этот Болг проект), так что пишу не очень, прошу понять, буду продолжать улучшать Это мое собственное, это нормально, чтобы понять, что я имею в виду0.0

Основное содержание этой практики — беспарольный вход в SSH, потому что ям действительно много, поэтому это занимает много времени. При изучении технологии лучше всего понимать принцип.Например принцип использования Travis для входа на сервер через SSH.Сначала я не понял смысла инструкций в онлайн-туториале.Но однажды вы понимаете немного принцип, это кажется намного проще.

Себе: учись больше, делай больше резюме!

Ссылка на ссылку