自动化部署|自动化部署 docker 项目
自动化部署 docker 项目
Jenkins + Ansible + Gitlab 自动化部署 基于docker的nginx+flask+gunicorn+mysql项目
【自动化部署|自动化部署 docker 项目】三剑客环境搭建
确保两台服务器一台 gitlab.example.com 提供 gitlab 代码仓库服务, 一台 jenkins.example.com 提供 jenkins + ansible 服务。两台服务器三个服务部署主机 flask.example.com 上的 flask 项目
搭建过程参考
GitLab
准备 flask 项目
[root@gitlab.example.com lab_project]# tree -L 3 ./
./
├── docker-compose.yml
├── flask
│├── Dockerfile
│└── lab_app
│├── app
│├── manage.py
│├── __pycache__
│├── requirement.txt
│└── venv
├── mysql
│├── Dockerfile
│└── laboratory_web.sql
├── nginx
│├── Dockerfile
│├── nginx.conf
│└── seafile.conf
└── seafile
└── docker-compose.yml8 directories, 10 files
将 flask 项目添加进gitlab
# 在gitlab页面建好一个项目
# 登录gitlab主界面,添加一个New project,输入 Project name: lab_project 和 Project description : lab_project repo,Visibility Level 选择默认 Private,创建好后复制仓库http地址 COPY URL
# 回到 gitlab.example.com 服务器,在用户下创建 repo 目录
mkdir repo
cd repo
# 这里的 -c http.sslVerify=false 用来避免本地证书无法进行clone操作,如果没有添加dns,则直接访问ip/root/test-repo.git 输入用户名和密码
git -c http.sslVerify=false clone https://gitlab.example.com/root/lab_project.git
mv /root/lab_project/ /root/repo/lab_project/
# 添加lab_project到本地仓库
git add .
# 提交
git commit -m"First commit of lab_project"
# 提示创建本地git全局的邮箱和用户名,再次运行 git commit -m"First commit" 即可提交成功
git config --global user.email "admin@example.com"
git config --global user.name "admin"
# 输入账号密码,同步本地master分支到远程服务器当中
git -c http.sslVerify=false push origin master
Ansible ansible-playbook
在 jenkins.example.com 上配置 ansible-playbook
# 加载ansible
source /root/ansible/hacking/env-setup -q
# 验证是否开启ansible服务
ansible-playbook --version
cd repo
mkdir ansible-playbook-repo
cd ansible-playbook-repo
# 创建如下目录结构
[root@jenkins.example.com ~]# tree ./lab_project_playbook/
./lab_project_playbook/
├── deploy.retry
├── deploy.yml
├── inventory
│├── dev
│└── prod
└── roles
├── docker-ce
│├── handlers
││├── main.yml
││├── yum-clean-metadata.yml
││└── yum-makecache.yml
│├── tasks
││├── install_docker-ce_based.yml
││├── install_docker-compose.yml
││├── main.yml
││└── remove_oldder_version_docker.yml
│└── vars
│└── main.yml
└── lab_project
├── tasks
│├── install_based.yml
│├── main.yml
│└── pull_base_image.yml
└── vars
└── main.yml9 directories, 16 filesvim deploy.retry
flask.example.comvim deploy.yml
- hosts: "lab_project"
gather_facts: true
remote_user: root
roles:
- { role: docker-ce }
- { role: lab_project }vim inventory/dev
vim inventory/prod
[lab_project]
flask.example.comvim roles/docker-ce/tasks/main.yml
---
# tasks file for docker-ce
- include: remove_oldder_version_docker.yml- name: clean repo
yum_repository:
name: docker-ce
state: absent
notify: yum-clean-metadata- include: install_docker-ce_based.yml- name: config repo
shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
notify: yum-makecache- name: install docker-ce
yum:
name: docker-ce
state: present
register: docker_installed- name: enable & start docker
when: docker_installed is success
service:
name: docker
enabled: yes
state: started- include: install_docker-compose.ymlvim roles/docker-ce/tasks/remove_oldder_version_docker.yml
---
# possible saved as remove_oldder_version_docker.yml
- name: remove oldder version docker
yum:
name: "{{ item }}"
state: absent
with_items:
- docker
- docker-client
- docker-client-latest
- docker-common
- docker-latest
- docker-latest-logrotate
- docker-selinux
- docker-engine
- docker-engine-selinuxvim roles/docker-ce/tasks/install_docker-ce_based.yml
---
# possible saved as install_docker-ce-based.yml
- name: install yum-utils device-mapper-persistent-data lvm2
yum:
name: "{{ item }}"
state: latest
with_items:
- yum-utils
- device-mapper-persistent-data
- lvm2vim roles/docker-ce/tasks/install_docker-compose.yml
---
# possible saved as install_docker-compose.yml
- name: check if docker-compose exists
stat: "path={{ docker_compose_file_path }}"
register: docker_compose_file- name: install docker-compose
when: not docker_compose_file.stat.exists
get_url:
url: "{{ docker_compose_file_url }}"
dest: "{{ docker_compose_file_path }}"
validate_certs: no
mode: 0755vim roles/docker-ce/handlers/main.yml
---
# handlers file for docker-ce
- include: yum-clean-metadata.yml
- include: yum-makecache.ymlvim roles/docker-ce/handlers/yum-clean-metadata.yml
---
- name: yum-clean-metadata
command: "yum clean metadata"vim roles/docker-ce/handlers/yum-makecache.yml
---
- name: yum-makecache
command: "yum makecache"vim roles/docker-ce/vars/main.yml
---
# vars file for docker-ce
docker_compose_file_url: https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64
docker_compose_file_path: /usr/local/bin/docker-composevim roles/lab_project/tasks/main.yml
---
# tasks file for start lab_app
- include: install_based.yml- include: pull_base_image.yml- name: close git ssl verification
command: "git config --global http.sslVerify false"
register: git_sslVerify- name: clone git.repo to remote
when: git_sslVerify is success
git:
repo: "https://{{ gitlab_user | urlencode }}:{{ gitlab_pass | urlencode }}@192.168.220.132/root/lab_project.git"
dest: "{{ lab_project_dir }}"
force: yes- name: check if lab_project exists
stat: 'path={{ lab_project_dir }}'
register: lab_project_stat- name: run the docker-compose
when: lab_project_stat.stat.exists
command: 'docker-compose up -d'
args:
chdir: "{{ lab_project_dir }}"vim roles/lab_project/tasks/install_base.yml
---
# possible saved as install_based.yml
- name: Install pip
yum:
name: python2-pip
state: installed- name: Install docker python lib
pip:
name: docker- name: Install git package
yum:
name: git
state: presentvim roles/lab_project/tasks/pull_base_image.yml
---
# possible saved as pull_base_image.yml
- name: pull base image
docker_image:
name: "{{ item }}"
state: present
with_items:
- mysql:5.7.20
- python:3.8.0-alpine
- nginx:1.16.1vim roles/lab_project/vars/main.yml
---
lab_project_dir: /root/lab_project
gitlab_user: root
gitlab_pass: 1234qwercd root/repo/ansible-playbook
# 添加修改后的 ansible-playbook 项目到 gitlab
git add .
# 提交
git commit -m"This is my lab_project ansible playbook commit"
#输入账号密码,同步本地master分支到远程服务器当中
git -c http.sslVerify=false push origin master
Jenkins Freestyle 任务构建和自动化部署
# 进入 Jenkins
# Jenkins 进入 New Item 新建任务
输入 lab_project 选择Freestyle project
# 编辑描述信息
Description:This is lab project job
# 选择参数化构建过程,添加参数
# This project is parameterized -> Add Parameter -> Choice Parameter (选项参数)
Name : deploy_env
Choices : dev
prod
Description : Choose deploy environment
# 选择 add Parameter 选择 String Parameter (文本参数)
Name : branch
Default Value : master
Description : Build branch
# 配置源代码管理
进入 gitlab 仓库, 选择 Administrator / test-repo 代码仓库 clone URL
将 https://gitlab.example.com/root/ansible-playbook-repo.git 粘贴到
Jenkins Source Code Management 的 Git 选项中的 Repository URL
Credentials 选择之前创建的 Git Credential 凭据 (凭据验证通过可以看到错误消失)
# Build配置 -e branch=$branch -e env=$deploy_env 表示在 jenkins 的环境变量引入到 ansible
选则 Build,点击 Add build step,选则 Execute shell
在 command 中输入#!/bin/shset +x
source /root/ansible/hacking/env-setup -qcd $WORKSPACE/lab_project_playbook
ansible --version
ansible-playbook --versionansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=nginx -e branch=$branch -e env=$deploy_env# 保存并开始构建
# 访问部署目标主机的域名或ip地址,即可访问
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- Beego打包部署到Linux
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- 人脸识别|【人脸识别系列】| 实现自动化妆
- Spring|Spring Boot部署到Resin遇到的问题
- docker镜像探索----dive工具
- 如何在阿里云linux上部署java项目
- 部署专题集合
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 一键编译部署Mysql