因为本站 Gryen-GTD 的静态资源部署到了七牛云,所以,本站的构建发布需要两步操作。首先,要构建静态资源并发布到七牛云,第二步是更新部署于生产服务器 PHP 项目代码。
服务器系统是 ubuntu 16.04。
安装 jenkins
检查服务器有没有安装 java8 环境,Jenkins 需要 java8 环境,执行以下命令,安装 java8。
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt install oracle-java8-installer
添加 Jenkins 源,执行以下命令:
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
添加以下代码到 /etc/apt/sources.list
:
deb https://pkg.jenkins.io/debian-stable binary/
更新源,安装 Jenkins:
$ sudo apt-get update
$ sudo apt-get install jenkins
安装过程中,出现 Jenkins 启动失败的报错。Jenkins 默认使用 8080 端口号,java8 环境正常的情况下,考虑是 8080 端口被占用,修改 /etc/default/jenkins
中 jenkins 服务的端口号。
HTTP_PORT=8081
启动停止 Jenkins 的命令如下:
$ sudo service jenkins start
$ sudo service jenkins stop
Jenkins 服务已经安装好,如果是本地安装,那么可以通过浏览器访问 http://localhost:8081
以继续 Jenkins 的初始化操作。我把 Jenkins 装在了远程服务器上面,因此需要配置 nginx 配置域名反向代理到 nginx,Jenkins 提供了配置范例,如下所示:
upstream jenkins {
keepalive 32; # keepalive connections
server 127.0.0.1:8080; # jenkins ip and port
}
server {
listen 80;
server_name jenkins.example.com;
#this is the jenkins web root directory (mentioned in the /etc/default/jenkins file)
root /var/run/jenkins/war/;
access_log /var/log/jenkins/access.log;
error_log /var/log/error.log;
ignore_invalid_headers off; #pass through headers from Jenkins which are considered invalid by Nginx server.
location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
#rewrite all static files into requests to the root
#E.g /static/12345678/css/something.css will become /css/something.css
rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
}
location /userContent {
#have nginx handle all the static requests to the userContent folder files
#note : This is the $JENKINS_HOME dir
root /var/lib/jenkins/;
if (!-f $request_filename){
#this file does not exist, might be a directory or a /**view** url
rewrite (.*) /$1 last;
break;
}
sendfile on;
}
location / {
sendfile off;
proxy_pass http://jenkins;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off; # Required for HTTP CLI commands in Jenkins > 2.54
proxy_set_header Connection ""; # Clear for keepalive
}
}
初始化 Jenkins
Jenkins 服务安装好之后,使用浏览器访问,会打开 Jenkins 的解锁界面。使用 /var/lib/jenkins/secrets/initialAdminPassword
中的密码解锁 Jenkins,然后可以按照界面提示,根据自己的需要初始化 Jenkins。
使用 Jenkins 配置持续集成的一些前置操作
ssh key
使用 Jenkins 配置持续集成任务,需要 Jenkins 访问 Gryen-GTD 项目部署的机器(目标机),需要拉取 github 上托管的项目代码,这里需要在 Jenkins 所在服务器上生成下 ssh key。
在 Jenkins 所在服务器上,生成 ssh key,此操作在 jenkins 用户下执行(后续在服务器上的操作均在 jenkins 用户下)。执行以下命令,切换 jenkins 用户,生成 ssh key:
$ sudo su - jenkins // 切换到 jenkins 用户
$ ssh-keygen -t rsa
将公钥 ~/.ssh/id_rsa.pub
中的内容填写到目标机的 .ssh/authorized_keys
文件中(配置免密登录,免密登录还需要其他配置,自行搜索,这里不再赘述)。
github 项目的 Deploy keys 中也需要添加此公钥,此操作可解决后续配置 Jenkins 任务时拉取代码报错的问题。
Jenkins 所在服务器安装前端构建环境
Gryen-GTD 的前端构建需要使用 Yarn,因此需要安装 NodeJS。执行以下命令,安装 NodeJS:
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$ sudo apt-get install -y nodejs
安装 Yarn
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
执行 yarn --help
测试 Yarn 是否安装好。测试通过后,前端构建环境搭建完毕。
Jenkins 所在服务器安装七牛自动上传工具 qshell
本站 Gryen-GTD 的静态资源是直接使用七牛云的,自动发布还需要配置自动上传静态资源到七牛云的服务。七牛云提供了 qshell 工具可以方便地实现此服务,qshell 官方文档地址:《命令行工具(qshell)》,GitHub 代码地址:qiniu/qshell。
下载 qshell 工具并选择合适的版本,置于服务器的 /var/lib/jenkins/bin/qshell_linux_x64
路径(可以根据自己需要,放置于任意喜欢的可访问位置)。
执行以下命令配置 qshell 密钥(ak sk 在七牛云个人中心密钥管理界面可以获取,name 是该账号的名称):
$ /var/lib/jenkins/bin/qshell_linux_x64 account ak sk name
使用 qshell 的 qupload
指令上传文件,需要一个配置文件,来定义上传策略,这个文件也需要放置于服务器上,并保证 qshell 可访问,如何配置可阅读 qshell 官方文档。我的配置文件命名为 qshell.config
, 示例如下:
{
"src_dir" : "/path/Gryen-GTD/public/dist",
"bucket" : "[yourbuket]",
"key_prefix" : "dist/",
"rescan_local" : true,
"skip_file_prefixes" : "test,demo,.qrsignore",
"skip_path_prefixes" : "temp/,tmp/",
"skip_fixed_strings" : ".svn,.git",
"skip_suffixes" : ".DS_Store,.exe",
"delete_on_success" : true
}
自动上传静态资源到七牛云的服务器端配置完成。
至此,在 Jenkins 所在服务器上的一些前置操作均已完成,下面的操作只需通过 WEB 界面操作。
为 Gryen-GTD 配置自动构建发布任务
这里需要安装一个 Jenkins 插件 Publish Over SSH,以访问目标机,还需要为 Jenkins 添加一个 GitHub 凭据,以访问 GitHub API。以上两部操作完成后,就可以新建 Gryen-GTD 自动构建发布任务了。
安装并配置 Publish Over SSH 插件
在 Jenkins 系统管理 -> 插件管理 -> Available 面板搜索 Publish Over SSH 并安装,然后转到 系统管理 -> 系统设置 里面找到 Publish over SSH 节点。
- Path to key 填入
.ssh/id_rsa
,即在上述步骤中生成的 ssh private key 的相对路径 - SSH Servers 是目标机的 ssh 配置,Name 自己定义
- Hostname 是目标机的 ip 地址
- Remote Directory 是 Gryen-GTD 项目的部署路径
配置完成后,可点击 Test Configuration 按钮测试是否可以连接,测试成功,点击 Save 保存配置。
为 Jenkins 添加一个 GitHub 凭据
- 转到 https://github.com/settings/tokens 添加一个 Personal access tokens。
jenkins 需要 repo、admin:repo_hook 两个权限节点,生成 token 后不要走开,注意复制 Secret 值,github 提示这个值只会出现一次。 - 转到 Jenkins 的凭据添加页面,填入上面复制的 Secret 值,类型选择
Secret text
,描述我填写的github
- 转到 Jenkins 系统管理找到 GitHub 节点,配置 GitHub API 权限。凭据选择刚才添加的那个,这里是 github。保存配置,凭据添加完成。
配置 Gryen-GTD 自动构建部署任务
新建一个任务,填入项目名称 Gryen-GTD 或者其他,选择“构建自由风格的软件项目”,转到任务的配置界面。
- General->GitHub 项目->项目 URL 填入项目的路径,这里是:
https://github.com/itargaryen/gryen-gtd/
; - Source Code Management 选中 Git,Repositories 节点的 Repository URL 填入项目的 GitHub 地址,这里是:
git@github.com:itargaryen/gryen-gtd.git
; - Build Triggers 选中
GitHub hook trigger for GITScm polling
; - Build 面板添加构建任务,点击 Add build step 按钮,选择
执行 shell
。- 第一个要添加的是静态资源构建任务,其中写了一个简单的判断来清除已经生成过的文件,代码如下
yarn if [ -d "public/dist/" ];then
rm -rf public/dist/*
fi
yarn run prod - 第二个是上传静态资源到七牛云的操作,代码如下:
/var/lib/jenkins/bin/qshell_linux_x64 qupload qshell.config
- 第三个任务是要在目标机上更新代码,因此在点击 Add build step 按钮后要选择
Send file or execute commands over SSH
。点击 Add Server 按钮,在 SSH Server 面板的 Name 中选择在 Publish Over SSH 插件配置时配置好的目标机服务器。在 Transfers 面板中 Exec command 节点填入更新代码的操作命令,我的配置如下:cd /path/Gryen-GTD && php artisan down && git pull && composer install && php artisan up
点击页面底部的 save 按钮保存配置,一个任务就新建好了。
- 第一个要添加的是静态资源构建任务,其中写了一个简单的判断来清除已经生成过的文件,代码如下
立即构建和自动构建
在每次提交代码到 Github 上之后,可以触发 Jenkins 开始一次 Gryen-GTD 的发布任务,或者,在 Jenkins 任务管理界面也可以通过 立即构建 按钮马上开始一次新的构建。点击任务 ID 可以查看此次构建的过程,构建出错时,也可以通过这里查找原因。
发表回复