流程

1.CI(持续集成)

在代码POM文件实现,通过maven打包镜像
命令如下:
mvn clean compile jib:build

2. CD(持续部署)
通过ansible的playbook功能实现(目录/etc/ansible)
目录结构:
tree-ansible

ansible
├── ansible.cfg
├── hosts //ansible可访问的服务器
├── roles
│ ├── xxx-server //项目roles规则
│ │ └── tasks
│ │ └── main.yml
└── site.yml //项目tasks列表


项目site.yml如下:
site.yml

- name: deploy proxy
hosts: all
gather_facts: false
roles:
- {role: bsd-operation, tags: “xxx-server1”}
- {role: bsd-shoppingcart-sync, tags: “xxx-server2”}


项目yml文件如下(单个项目):

main.yml

- pip:
name: docker-py
state: present
- name: Login registry
docker_login:
registry: registry.cn-hangzhou.aliyuncs.com
username: xxxx
password: xxxx
reauthorize: yes
- name: Pull image
docker_image:
name: registry.cn-hangzhou.aliyuncs.com/xxx
state: present
force: yes
- name: Restart container
docker_container:
name: “{{ name }}”
image: registry.cn-hangzhou.aliyuncs.com/xxx
network_mode: host
volumes:
- /data/logs:/store/logs
log_driver: json-file
log_options:
max-size: “10M”
max-file: “10”
recreate: yes
restart_policy: always
state: started
force_kill: true
command: ‘profile=”{{ profile }}” port=”{{ port }}”‘
env:
ENV=”{{ env }}”
- name: Clean image
shell: docker image prune -f

3.Jenkins部署

shell

IP=10.21.73.29
Port=9596
Env=test
Name=xxx
mvn clean compile jib:build -Djib.container.jvmFlags=-Xms2048m,-Xmx2048m

ansible-playbook /etc/ansible/site.yml -l ${IP} -t ${Name} -e name=${Name} -e port=${Port} -e profile=${Env} -e env=${Env}

-l:远程服务器
-t:ansible任务名称
-e: name容器名称
-e prot端口
-e profile配置环境(apollo)
-e env应用环境(dev,test,prod)

规范

名称规范

ansible的roles和tasks,和容器的名称,和镜像名称保持一致(pom文件定义),开发人员在定义项目名称的时候一定要规范

端口规范

端口定义时,一定要留范围,不然同一个应用做负载没有端口

目录规范

日志路径,/store/logs/项目名称(/store挂载到nfs)


写评论…