7

图文无关
图文无关

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。
Jenkins 作为一款软件开发的神器,能帮团队很优雅地解决编译和发布等工作。支持超多的第三方系统软件,自定义 Shell 脚本,丰富的插件,可以让你游刃有余地完成很多自动化的工作。

Jenkins 能解决以下几类问题:

  1. 自动化构建软件
  2. 自动化检查
  3. 构建可持续的自动化测试
  4. 自动化打包和分发部署

安装 Jenkins

提供两种安装方式。

  1. 下载 Jenkins
  2. 解压 war 文件,运行 java -jar jenkins.war
  3. 访问 http://localhost:8080 根据页面指导完成安装

docker

我更加推荐这种方式。仓库地址:https://hub.docker.com/_/jenk...

  1. docker pull jenkins
  2. 挂载目录到宿主机,例如使用/var/jenkins_home,需要给目录设置访问权限

    chown 1000 /var/jenkins_home
  3. 启动。 使用 root 账号进行登录,暴露端口 8080,tcp 端口50000

    docker run -u root -itd --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins
  4. 根据指导完成注册
  5. 安装插件。一定要安装插件: Publish Over SSH

使用 Jenkins 做集群部署流程

clipboard.png

  1. client 发送编译指令到 Jenkins Server.
  2. Jenkins Server 从 Git repo 拉取代码
  3. 编译,打包
  4. 把编译后的结果通过 ssh push 到业务服务器 server1、server2、server3

配置业务服务器

  1. 安装插件 Publish Over SSH
  2. 进入到 /configure 页面。配置 jenknis 的私钥,和远程服务地址和端口等等。

    clipboard.png

  3. 特别留意Remote Directory,jenkins 推送过去的文件都会出现在这个目录,设置远程服务器的绝对路径有可能无效。使用相对路径即可。
  4. 如果有多台机器,都在这里进行配置。另外,需要把 Jenkins 的公钥,添加到 server1-3 的 ~/.ssh/authorized_keys

    1. ssh  jenkins 宿主机
    2. cat /var/jenkins_home/.ssh/id_rsa.pub
    3. 把公钥存放到 server1-3 的`~/.ssh/authorized_keys` 
    4. 这样 jenkins 这台机器就可以免密登陆到 server1-3
    5. 如果 Jenkins 机器没有 /var/jenkins_home/.ssh/,那么就通过`ssh-keygen`生成
  5. 测试机器的连接。

配置发布任务。

测试环境和产品环境应该使用不同的任务,因为服务会部署到不同的机器。执行流程也可能有差异。

1.新建 FreeStyle 项目

clipboard.png

2. 配置仓库

  1. 配置代码仓库,git,svn 等等都 ok
  2. Repositories 使用 ssh 的模式。
  3. 需要把 /var/jenkins_home/.ssh/id_rsa.pub 添加到仓库的 access_key 里面。保证 jenkins 可以免密获取到代码,这个是最简单那的配置

clipboard.png

3. 配置任务

以 node 项目为例,Jenkins shell 默认使用 非交互+非登陆式,所以获取不到环境变量。解决办法第一行需要写成 #!/bin/bash -l

编译任务都在这里完成了。

clipboard.png

4. 发布到远程服务器

  1. 添加一个构建后的操作,Send build artifacts over SSH
  2. 推送文件到远程机器,在远程机器执行备份和重启
    clipboard.png
  3. 注意sources files是基于当前项目的工作目录,绝对路径是无效的,
  4. Remote directory 也是基于远程服务器的工作目录,在配置Publish Over SSH的时候指定的。
  5. Exec command 意思就是在文件全部发送到远程机器,执行以下的脚本。建议先备份之前的工作目录,方便回滚代码
  6. 你可以配置多台机器完成部署工作

5. 其他问题

  1. SSH: Transferred 0 file(s)。 文件发送为空。Source files 配置不对,应该是基于当然项目的相对路径
  2. Shell command not found. #!/bin/bash -l
  3. Jenkins 安装部署的问题见他的官方文档。https://hub.docker.com/_/jenk...
  4. 实践的过程中遇到了很多问题,都一一解决了,有问题可以留言。

使用 docker 部署

  1. DockerFile
FROM node:8

MAINTAINER 123 <123@123.me>

expose 7001

ENV LANG="C.UTF-8" \
    TZ="Asia/Shanghai"

WORKDIR /data/work/

#设置时区
RUN echo Asia/Chongqing > /etc/timezone \
  && ln -sfv /usr/share/zoneinfo/Asia/Chongqing /etc/localtime

RUN echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib \n\
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib \n\
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib \n\
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" \
  > /etc/apt/sources.list \
  && apt-get update \
  && apt-get install -y libsasl2-dev libsasl2-modules-gssapi-heimdal \
  && rm -rf /var/lib/apt
  
  
  
#加入node程序并安装npm包
ADD ./ ./
RUN set -ex \
  && npm install -g cnpm --registry=https://registry.npm.taobao.org \
  && cnpm install egg-development-proxyworker \
  && cnpm install --production \
  && cd clientapp \
  && cnpm install \
  && NODE_ENV="production" cnpm run build:prod


CMD /bin/bash -c "npm run prod && while pidof node; do sleep 60; done"
  1. Build
#!/bin/bash -l
set -ex 

docker build -t registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER} .
# docker image tag registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER} registry.cn-hangzhou.aliyuncs.com/123/minerdash:latest

docker push registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}
  1. 发布
set -ex
docker pull registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}
docker rm -f minerdash || true
docker run -d --name minerdash --network host registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}

其他资料

  1. Jenkins Github 持续集成
  2. Jenkins执行shell读不到环境变量问题
  3. Jenkins 文档

流星狂飙
2k 声望784 粉丝

原谅我一生放荡不羁笑点低!