1. 程式人生 > >jenkins實現專案自動部署

jenkins實現專案自動部署

背景

之前給公司搭建過一套gitlab+gerrit+jenkins的持續整合環境,由於操作起來有點繁瑣,自己也沒太搞清楚該怎麼用,所以一直就只用了gitlab來做程式碼管理。最近要做一個專案自動部署的功能,使用過jenkins一定知道他的自動化功能。所以就從jenkins建立自動部署任務的方式來入手。

整體思路

jenkins可以配置觸發器,當有新的提交時,觸發執行相應的任務。由於jenkins和專案部署不在同一伺服器上,所以我想用ssh到遠端伺服器後執行對應的部署指令碼來做自動部署。

實現方式

我是按照倒推的思路來完成整個流程的。

1、 自動化部署指令碼

專案是用git管理的,首先指令碼要能夠實現切換到指定目錄下後pull對應的分支。

#! /bin/bash
#切換到專案路徑下
cd ~/coffee/myproject
git checkout -f
git clean -fd
git pull

可以通過接收的引數,來決定切換的專案路徑

#! /bin/bash
#切換到指定目錄
if [ "$1"x = "project1"x ];
then
  cd ~/coffee/myproject1
elif [ "$1"x = "project2"x ];
then
  cd ~/coffee/myproject2
elif [ "$1"x = "project3"x ];
then
  cd ~/coffee/myproject3
else
echo "failed" exit fi git checkout -f git clean -fd git pull

2、 遠端執行

首先在本地配置好在jenkins所在的伺服器上可以免登入ssh到要部署的伺服器上:利用ssh-keygen生成公鑰後,貼上到目標伺服器上~/.ssh/authorized_keys檔案中。此時在jenkins伺服器上即可遠端執行更新指令碼/

ssh root@192.168.1.100 "/root/myscript/pull.sh project1"

3、 配置jenkins任務

(1)填寫專案名稱
(2)在原始碼管理的位置,選擇git,在Repository URL裡填寫專案的URL,結果遇到報錯

stdout: 
stderr: Permission denied (publickey,keyboard-interactive). 
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

這種許可權錯誤,一般是因為ssh公鑰沒有新增到git伺服器上。但是這裡需要注意的一點是,需要填寫jenkins使用者下的公鑰。
執行su - jenkins後,發現沒有任何反應。原因是/etc/passwd中的/bin/bash變成了/bin/false。

sudo vim /etc/passwd

jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/false

改為

jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash

這時執行su - jenkins 後可以切換使用者,但是命令提示符的使用者名稱顯示的是

-bash-4.1$

解決方法是在jenkins使用者下的bash_profile新增命令列提示符環境變數

vim ~/.bash_profile 

新增

export PS1='[\u@\h \W]\$'

載入修改完的bash_profile:

source ~/.bash_profile

此時前面的使用者名稱提示恢復正常:

[jenkins@localhost ~]$

我在開始安裝jenkins時,使用以下命令生成過公鑰jenkins.pub:

ssh-keygen -C jenkins@163.com

將公鑰新增到gitlab後,仍然報許可權錯誤。此時看到gitlab上新增ssh公鑰說明,生成公鑰需要選擇-t rsa,而ssh-keygen預設使用的加密是dsa。
使用命令

ssh-keygen -t rsa

將新生成的公鑰新增到gitlab伺服器上,

此時可能需要在jenkins伺服器上,切換到jenkins使用者後執行一下:
git ls-remote -h [專案的git地址] HEAD
參考jenkins host key verification failed

之後就不再報許可權錯誤了。
Branch Specifier (blank for ‘any’)填寫自己要響應的分支變化。
(3)構建觸發器選擇
首先需要在jenkins安裝外掛Gitlab Hook Plugin,安裝完之後在構建觸發器就能看到:

Build when a change is pushed to GitLab. GitLab CI Service URL: http://xxx.com/project/myproject1

選中該選項。因為要在有push事件發生時,進行自動部署,因此勾選Build on Push Events。
(4)構建裡選擇增加構建步驟->Execute shell
Command 裡寫遠端執行更新指令碼的命令

ssh root@192.168.1.100 "/root/myscript/pull.sh project1"

(5)可選:如果想要一個失敗的訊息通知,可以在構建後操作裡,增加構建後操作步驟->Email Notification,填寫自己的郵箱即可
點選儲存。
但是此時還沒有配置完,我們需要通過gitlab的web hooks的功能,來讓jenkins接收到push的訊息。
4、 配置web hooks
剛才在構建觸發器裡有一項,裡面提供的地址就是我們要在gitlab的web hooks裡填寫的地址(下面只是我的一個示例地址)

Build when a change is pushed to GitLab. GitLab CI Service URL: http://xxx.com/project/myproject1

填寫完之後,我們的整個自動部署流程就已經可以運行了。自己push一下試試吧。