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 可以查看此次构建的过程,构建出错时,也可以通过这里查找原因。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注