传统的网站部署,在运维过程中,网站部署是运维的工作之一,网站部署的流程大致分为:
需求分析—原型设计—开发代码—提交测试—内网部署—确认上线—备份数据—外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚。(如下图所示)
目前主流网站部署方法,通过Hudson/Jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins非常易于安装和配置,简单易用。
简单来说方便如下人员:
持续集成(Continuous Integration)是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础。Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能。
持续部署( continuous deployment )是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率,让engineering productivity 最大化。
持续交付( Continuous delivery , 缩写为CD),是一种软件工程手法,让软件产品的产出过程在一个短周期内完成 ,以保证软件可以稳定、持续的保持在随时可以释出的状况。它的目标在于让软件的建置、测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。
IP地址 | 系统 | hostname | 硬件配置 | 角色 |
---|---|---|---|---|
172.17.2.239 | CenOS7.4虚拟机 | node01.ginvip.com | 2 CPU 4G MEM | gitlab |
172.17.2.240 | CenOS7.4虚拟机 | node02.ginvip.com | 2 CPU 4G MEM | jenkins |
172.17.2.241 | CenOS7.4虚拟机 | node03.ginvip.com | 2 CPU 4G MEM | jenkins从节点 |
Jenkins中文文档见:
https://jenkins.io/zh/doc/book/installing/#downloading-and-running-jenkins-in-docker
首先安装docker-compose:
pip install docker-compose -i https://mirrors.aliyun.com/pypi/simple/
docker-compose -v
docker-compose文件内容:
[root@node01 gitlab]# cat docker-compose.yml
version: '3'
services:
gitlab:
image: gitlab/gitlab-ce:10.8.4-ce.0
container_name: gitlab
ports:
- '80:80'
- '443:443'
- '2222:22'
volumes:
- /data/gitlab_docker/data:/var/opt/gitlab
- /data/gitlab_docker/logs:/var/log/gitlab
- /data/gitlab_docker/etc:/etc/gitlab
- /data/gitlab_docker/backups:/var/opt/gitlab/backups
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
#配置此参数,可以解决在创建项目时,gitlab以容器ID为域名的问题
external_url 'http://172.17.2.239'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['manage_backup_path'] = true
# 备份路径
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
# 备份文件权限
gitlab_rails['backup_archive_permissions'] = 0644
# 备份保留时间 604800 = 7天
gitlab_rails['backup_keep_time'] = 604800
#gitlab_rails['smtp_enable'] = true
#gitlab_rails['smtp_address'] = "smtp.163.com"
#gitlab_rails['smtp_password'] = "授权码"
#gitlab_rails['smtp_domain'] = "163.com"
#gitlab_rails['smtp_authentication'] = "login"
#gitlab_rails['smtp_enable_starttls_auto'] = true
#gitlab_rails['smtp_tls'] = true
#gitlab_rails['gitlab_email_from'] = '[email protected]'
#nginx['enable'] = true
#nginx['client_max_body_size'] = '10240m'
#nginx['redirect_http_to_https'] = true
#nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.cer"
#nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.xxxx.com.key"
#nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
#nginx['ssl_prefer_server_ciphers'] = "on"
#nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
#nginx['ssl_session_cache'] = "builtin:1000 shared:SSL:10m"
#nginx['listen_addresses'] = ["0.0.0.0"]
#nginx['http2_enabled'] = true
#postgresql['max_worker_processes'] = 8
#postgresql['shared_buffers'] = "256MB"
上面注释了很多选项,可视个人情况开启。注意修改上面的IP地址选项
启动gitlab容器:
[root@node01 gitlab]# docker-compose up -d
docker run \
--name jenkins \
--restart always \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins_docker:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
有个地方需要注意:在这里你不能用官方的Jenkins镜像,因为jenkins用户需有个地方需要注意:要属于docker用户组,这样才能使用socket,从而能在容器中的Jenkins调用docker,最终实现通过Jenkins构建和运行其他容器。
挂载docker.sock是让jenkins docker有权限操作宿主机上的docker
jenkins是纯文件存储,没有数据库,所有的数据都保存在xml文件中
jenkins会将所有的插件在启动时会读到内存中使用
浏览器访问:http://172.17.2.240:8080/
查看jenkins的管理员密码:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
修改jenkins中的更新源:
直接访问页面 http://172.17.2.240:8080/pluginManager/advanced,在最下方的升级站点栏中修改URL为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改 updates/default.json 配置文件(updates目录需要jenkins运行一会才会自动创建):
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
重启jenkins docker:
docker restart jenkins
docker-compose文件内容:
version: '3'
services:
sonarqube:
image: sonarqube
restart: always
container_name: sonarqube
ports:
- '9000:9000'
- '9092:9092'
volumes:
- /data/sonarqube_docker/data:/opt/sonarqube/data
- /data/sonarqube_docker/logs:/opt/sonarqube/logs
- /data/sonarqube_docker/extensions:/opt/sonarqube/extensions
# docker中运行的用户为sonarqube,uid,gid为999
启动容器后,浏览器访问:http://IP:9000,默认登录账号密码都为:admin,登录后生成一个token
注意保存好生成的token,该token可见性只有这一次,退出该页面后该token不可见
回到jenkins页面,安装==SonarQube Scanner ==插件,进入到jenkins的系统设置
在Global Tool Configuration中配置sonarqube scanner:
在jenkins job中使用sonarqube:
在Analysis properties中添加内容:
sonar.projectKey=demo
sonar.projectName=demo
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.sources=$WORKSPACE
sonar.java.binaries=$WORKSPACE
Jobs完成后,可到下面的URL查看代码检测结果:
http://172.17.2.240:9000/dashboard?id=demo # demo为上面指定的sonar.projectKey