Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308197
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 577
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-27 14:21
个人简介

知道自己该干嘛,知道自己能干嘛

文章分类

全部博文(52)

文章存档

2019年(1)

2018年(8)

2017年(2)

2016年(11)

2015年(3)

2014年(10)

2013年(17)

我的朋友

分类: 系统运维

2016-07-01 11:58:04


                            测试环境我们准备用docker 试试水,看看 docker 的效果,其实 docker 和以前的 vm 模式没有太大区别,流程还是一样的
                            这次我们的测试项目是个 nodejs 项目, 项目的构建流程:

                                           

                             这次我们主要介绍,  ansible 在代码构建后的 docker 景象制作, 代码推送,以及配置管理。
                             
                             
  1.                  jenkins add execute shell
  2.              
  3.                  branch=${branch##*/}  // 格式化分支名称, 比如分支名称如 origin/develop, 或者 origin/release/test

  4.                  defatult_tag=$(date "+%Y%m%d%H%M")  // 创建默认tag , 以时间戳定义

  5.                  GIT_TAG_NAME=${GIT_TAG_NAME:-${defatult_tag}} // 我们安装了 git parameter plugin 可以获取本次构建的 git tag, 如无 tag 引用默认tag
  6.                   
  7.                  ansible-playbook --extra-vars "project=${JOB_NAME} TAG=${GIT_TAG_NAME} branch=${branch} npm=${npm}" /etc/ansible/site.yml
  8.                  // npm 是我们在构建的时候选择的参数设置,后面的配置管理会根据npm内的构建参数,选择不同的下游环境 
  9.                // JOB_NAME jenkins env-vars
  1.                 ansible 目录结构:
                  [root@jenkins ansible]# tree
                  .
                  ├── ansible.cfg
                  ├── hosts
                  ├── project
                  │   └── three-layer-dream
                  │       ├── templates
                  │       │   ├── default.conf.j2
                  │       │   └── dockerfile.j2
                  │       └── varsfile
                  ├── roles
                  │   ├── dockerimage
                  │   │   └── tasks
                  │   │       └── main.yml
                  │   └── synccode
                  │       └── tasks
                  │           └── main.yml
                  └── site.yml

                 8 directories, 8 files

                 
  1.                 site.yml
  2.                 ---
                    # This playbook deploys the whole application stack in this site.
                    - hosts: 10.3.1.11
                      user: root
                      gather_facts: false
                      vars_files:
                         - project/{{ project }}/varsfile  // 引用项目下的变量文件

                      roles:
                        - { role: dockerimage, when: "branch not in 'master'" }  // 非 master 分支,bulid image,push image to registry
                        - { role: synccode, when: "branch in 'master'" }   // master 分支, push code to 发布系统
                  
                  [root@jenkins ansible]# cat project/three-layer-dream/varsfile 

                  code_dir: /data/jenkins_data/workspace/three-layer-dream/dist/     // jenkins workspace 目录地址

                  image_code_dir: /usr/share/nginx/html/                             // docker image 里代码存放的目录

                  image: nginx       // FROM 父景象                   

                  frontend: true     // 定义变量,程序的类型,task 会根据变量值执行相应任务

                  dockerfile: /etc/ansible/project/three-layer-dream/templates/dockerfile.j2   // 使用 jinja template 生成 dockerfile

                  template: /etc/ansible/project/three-layer-dream/templates/default.conf.j2   // 使用 jinja template 生成 nginx conf 
 
                  remote_code_dir: /data/www/wepiao_project/three-layer-dream/    // master 分支, 推送发布系统的代码路径

                
                  [root@jenkins three-layer-dream]# cat templates/dockerfile.j2 
                  FROM {{ image }}
                  MAINTAINER wepiao_Cail

                  COPY {{ project }} {{ image_code_dir }}

                  ADD default.conf /etc/nginx/conf.d/default.conf

                  [root@jenkins three-layer-dream]# cat templates/default.conf.j2 
                  upstream mqqcgi_pool {

                   {% if "test" in npm|string() %}
                      server 192.168.101.xx:9082;
                   {% else %}
                      server 10.104.2.xx:9082;
                   {% endif %}
                      keepalive 32;
                  }                       // 根据前面选择的构建参数内容,选择下游的cgi转发环境


                   server {

                            listen       80;
                            server_name  localhost;
                            root   /usr/share/nginx/html;
                            index  index.html index.htm;

                            # gzip compression configure
                              gzip                    on;
                              gzip_http_version       1.1;
                              gzip_comp_level         6;
                              gzip_proxied            any;
                              gzip_min_length         1k;
                              gzip_buffers            4   16k;
                              gzip_types              text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/json ;
                              gzip_vary on;

                              proxy_buffering on; 
                              proxy_buffer_size   256k;
                              proxy_buffers   4 256k;
                              proxy_busy_buffers_size   256k;

                     location  ~* /(cgx|jsox|datx)/|\.json$  {
                                 proxy_pass
                                 proxy_set_header Host $host;
                                 proxy_set_header X-Forwaded-For $remote_addr;
                                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                     }
        
                     location ~* ^/[a-z_-]*[0-9]*\.html {
                               try_files $uri /index.html;
                     }

                     error_page   500 502 503 504  /50x.html;
                     location = /50x.html {
                               root   /usr/share/nginx/html;
                     }
}


                    [root@jenkins ansible]# tree roles/dockerimage/
                     roles/dockerimage/
                     └── tasks
                           └── main.yml

                     1 directory, 1 file

                    [root@jenkins ansible]# cat roles/dockerimage/tasks/main.yml 
                     ---

                     - name: Create a temporary directory
                       command: mktemp -d 
                          args:
                                chdir: /tmp
                       register: tempdir


                     - name: Working directory is defined variable
                       set_fact:
                            workdir: "{{ tempdir.stdout }}"

                     - name: Synchronization code
                       synchronize: src={{ code_dir }} dest={{ workdir }}/{{ project }}
                       when: tempdir.changed

                     - name: Configure dockerfile jinja template
                       template: >
                           src={{ dockerfile }}
                           dest={{ workdir }}/Dockerfile
                           owner=root
                           group=root
                           mode=0644

                     - name: Configure nginx config jinja template
                       template: >
                           src={{ template }}
                           dest={{ workdir }}/default.conf
                           owner=root
                           group=root
                           mode=0644
                           when: frontend   


                     - name: Build docker image version "{{ project }}:{{ branch }}-{{ TAG }}"
                       docker_image: >
                           path={{ workdir }}
                           name={{ project }}
                           tag={{ branch }}-{{ TAG }}
                           state=present


                     - name: Clean {{ workdir }} directory
                       file: path={{ workdir }} state=absent


                     - name: Docker tag "{{ project }}:{{ branch }}-{{ TAG }}" image
                       command: docker tag {{ project }}:{{ branch }}-{{ TAG }} registry.wepxx.com:5000/{{ project }}:{{ branch }}-{{ TAG }}

                     - name: Push "{{ project }}:{{ branch }}-{{ TAG }}" to registry.wexx.com
                       command: docker push registry.wepxx.com:5000/{{ project }}:{{ branch }}-{{ TAG }}
                       register: result

                     - name: Untag image 
                       command: docker rmi registry.wepxx.com:5000/{{ project }}:{{ branch }}-{{ TAG }}
                       when: result.changed

                     - name: Clean image
                       command: docker rmi {{ project }}:{{ branch }}-{{ TAG }}
                       when: result.changed

                    [root@jenkins ansible]# cat roles/synccode/tasks/main.yml 
                     ---

                     - name: Mkdir pulish code directory 
                       file: >
                          path={{ remote_code_dir }}
                          state=directory
                          mode=0755
                       delegate_to: 10.104.33.xxx

                     - name: Synchronize {{ project }} branch:{{ branch }} code
                       command: rsync -avSH --delete {{ code_dir }} 10.104.33.xxx:{{ remote_code_dir }} warn=false
                       delegate_to: 127.0.0.1

                      我们进入测试环节 触发一次构建,进入构建任务 
                     --- 省略代码构建环节日志 ---

                     
[three-layer-dream] $ /bin/sh -xe /usr/local/tomcat/temp/hudson1906818216314016688.sh
                       + branch=develop
                       ++ date +%Y%m%d%H%M
                       + defatult_tag=201607011053
                       + GIT_TAG_NAME=201607011053
                       + ansible-playbook --extra-vars 'project=three-layer-dream TAG=201607011053 branch=develop npm=npm run pre' /etc/ansible/site.yml

                       PLAY ***************************************************************************

                       TASK [dockerimage : Create a temporary directory] ******************************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Working directory is defined variable] *********************
                       ok: [10.3.1.11]

                       TASK [dockerimage : Synchronization code] **************************************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Configure dockerfile jinja template] ***********************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Configure nginx config jinja template] *********************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Build docker image version "three-layer-dream:develop-201607011053"] ***
                       changed: [10.3.1.11]

                       TASK [dockerimage : Clean /tmp/tmp.TQZ5oRa1Qo directory] ***********************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Docker tag "three-layer-dream:develop-201607011053" image] *
                       changed: [10.3.1.11]

                       TASK [dockerimage : Push "three-layer-dream:develop-201607011053" to registry.weixx.com] ***
                       changed: [10.3.1.11]

                       TASK [dockerimage : Untag image] ***********************************************
                       changed: [10.3.1.11]

                       TASK [dockerimage : Clean image] ***********************************************
                       changed: [10.3.1.11]

                       TASK [synccode : Mkdir pulish code directory] **********************************

                       TASK [synccode : Synchronize three-layer-dream branch:develop code] ************

                       PLAY RECAP ********************************************************************* 
                       10.3.1.11                  : ok=11   changed=10   unreachable=0    failed=0   

                       Finished: SUCCESS

                       登陆 registry UI 查看镜像是否成功上传:
                      

                        OK, 完美收工,后续我们会讲解,如何使用 swarm UI 界面 shipyard 去启动,停止,销毁一个镜像,
                             使我们整体的构建流程完全可以给QA自助服务。
                               
                               
                                                                                                          Cail_wepiao

                          
                        参考资料:
                                  

         
                                 


                            
                            
阅读(2663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~