Ubuntu 系统安装 Jenkins 持续集成 Gryen-GTD

因为本站 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 凭据

  1. 转到 https://github.com/settings/tokens 添加一个 Personal access tokens。


    jenkins 需要 repo、admin:repo_hook 两个权限节点,生成 token 后不要走开,注意复制 Secret 值,github 提示这个值只会出现一次

  2. 转到 Jenkins 的凭据添加页面,填入上面复制的 Secret 值,类型选择 Secret text,描述我填写的 github

  3. 转到 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

    1. 第一个要添加的是静态资源构建任务,其中写了一个简单的判断来清除已经生成过的文件,代码如下

      yarn
      if [ -d "public/dist/" ];then
      rm -rf public/dist/*
      fi
      yarn run prod
    2. 第二个是上传静态资源到七牛云的操作,代码如下:

      /var/lib/jenkins/bin/qshell_linux_x64 qupload qshell.config
      
    3. 第三个任务是要在目标机上更新代码,因此在点击 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 可以查看此次构建的过程,构建出错时,也可以通过这里查找原因。

技术 Gryen-GTD Jenkins CI 持续集成
本文更新于