更新时间:2021年5月24日
DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠
在开发工程中可以频繁的将代码部署并集成到服务器进行自动化测试
在持续集成的环境基础之上,将代码部署到预生产环境
在持续交付的基础上,把部署到生产环境的过程自动化
持续部署和持续交付的区别在于最终部署到生产环境是自动化的
Jenkins是一款基于Java编写的开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件
yum -y install java-1.8.0-openjdk*
国内下载源:清华源
cd /opt
#如果下载较慢可以尝试scp上传
curl -o /opt/jenkins-2.277.4-1.1.noarch.rpm https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.4-1.1.noarch.rpm
#使用版本为最新的LTS稳定版
rpm -ivh jenkins-2.277.4-1.1.noarch.rpm
cd /etc/sysconfig
cp -p jenkins{
,.bak}
sed -i "47c JENKINS_JAVA_OPTIONS=\"-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true\"" jenkins.bak
cat jenkins.bak > jenkins
cd /var/lib/jenkins/updates
cp -p default.json{
,.bak}
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.bak
cat default.json.bak > default.json
systemctl start jenkins
netstat -natp | grep java
根据提示的路径查看密钥
cat /var/lib/jenkins/secrets/initialAdminPassword
如果不知道该如何选择可以点击安装推荐的插件
如出现插件安装失败多重试几次即可
yum -y install git
#配置git使用用户
git config --global user.name "fox"
#配置git使用邮箱
git config --global user.email "***@qq.com"
#配置git语法高亮
git config --global color.ui true
git config --list
mkdir /work
cd /work
git init
git status
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目
官方下载源:https://packages.gitlab.com/gitlab/gitlab-ce
yum install -y policycoreutils-python
#YUM安装[不推荐]
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum install gitlab-ce-13.12.0-ce.0.el7.x86_64
#RPM安装
rpm -ivh gitlab-ce-13.12.0-ce.0.el7.x86_64.rpm
gitlab-ctl reconfigure
gitlab-ctl stop
vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
vim /etc/gitlab/gitlab.rb
#设置站点地址
external_url 'http://192.168.0.200'
#进程超时时间
unicorn['worker_timeout'] = 60
#减少进程数
unicorn['worker_processes'] = 10
#进程内存限制
unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
unicorn['worker_memory_limit_max'] = "300 * 1 << 20"
#减少数据库缓存
postgresql['shared_buffers'] = "256MB"
#减少数据库并发量
postgresql['max_parallel_workers_per_gather'] = 0
#关闭监控monitor
prometheus['monitor_kubernetes'] = false
egrep -v "#|^$" /etc/gitlab/gitlab.rb
#启动gitlab
gitlab-ctl start
主机 | IP地址 | 软件包 |
---|---|---|
Jenkins | 192.168.0.100 | Jenkins Git |
Gitlab | 192.168.0.200 | Gitlab |
Web | 192.168.0.10 | Nginx Git |
Shell 一键部署脚本
#!/bin/bash
yum -y install git pcre pcre-devel zlib zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
wget -P /opt http://nginx.org/download/nginx-1.12.0.tar.gz
cd /opt
tar zxvf nginx-1.12.0.tar.gz
#配置伪装数据
cd /opt/nginx-1.12.0/src/core
cp -p nginx.h{
,.bak}
sed -i '13c #define NGINX_VERSION "=)"' nginx.h.bak
sed -i '14c #define NGINX_VER "*Do you want have a bad time" NGINX_VERSION' nginx.h.bak
cat nginx.h.bak > nginx.h
cd /opt/nginx-1.12.0
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
make -j && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf
echo '
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service &> /dev/null
systemctl restart nginx
ss -tnlp | grep "nginx" &> /dev/null
if [ $? -eq 0 ];then
echo "Nginx部署完毕!"
fi
cd /usr/local/nginx/conf/
cp -p nginx.conf{
,.bak}
#获取CPU核心数量
CPU=`cat /proc/cpuinfo | grep -c "physical id"`
#开启性能优化
sed -i '12a\\ use epoll;' nginx.conf.bak
#开启伪装
sed -i '20a\\ server_tokens on;' nginx.conf.bak
#设置工作线程
sed -i "3c worker_processes $CPU;" nginx.conf.bak
#开启网页压缩
sed -i -e '35 s/#//g' -e '35a\\ gzip_min_length 1k;' -e '35a\\ gzip_buffers 4 16k;' -e '35a\\ gzip_http_version 1.1;' -e '35a\\ gzip_comp_level 6;' -e '35a\\ gzip_vary on;' -e '35a\\ gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;' nginx.conf.bak
#开启防盗链
sed -i -e '50a\\tlocation ~* \\\.(jpg|gif|swf)$ {' -e '50a\\t valid_referers none blocked *.benet.com;' -e '50a\\t if ( $invalid_referer ) {' -e '50a\\t rewrite ^/ http://www.benet.com/error.png;' -e '50a\\t }' -e '50a\\t root html;' -e '50a\\t expires 1d;' -e '50a\\t}' nginx.conf.bak
cat nginx.conf.bak > nginx.conf
将公钥分发到Gitlab服务器
#全部回车
ssh-keygen -t rsa
ssh-copy-id 192.168.0.10
查看公钥
cat /root/.ssh/id_rsa.pub
打开 Gitlab http://192.168.0.200
将 Jenkins 中的公钥插入其中 cat /root/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa
打开 Jenkins http://192.168.0.100:8080
打开 Gitlab http://192.168.0.200
密钥一定要保存好
打开 Jenkins http://192.168.0.100:8080
添加新的凭证
修改全局配置
打开 Jenkins http://192.168.0.100:8080
Jenkins查看Key cat /root/.ssh/id_rsa
打开 Jenkins http://192.168.0.100:8080
创建一个新项目
打开 Gitlab http://192.168.0.200
打开 Jenkins 项目选择源码管理,并勾选 git
配置构建触发器
Target branch Regex 目标分支正则表达式
生成WebHooks安全令牌
WebHooks是一种微服务API
通过自定义回调函数的方式来改变Web应用的一种行为
Source file 源文件地址 ,这里表示仓库中当前分支的所有代码
Remove prefix 指定要删除的目录
Remote directory 指将当前分支的代码所要部署的目录
Exec command 指代码部署后执行的指令,一般为重启服务
打开 Jenkins 项目 http://192.168.0.200/root/demo
选择设置 WebHooks
将刚才在 Jenkins 的key复制到这里
传数据至gitlab
cd /work
git clone [email protected]:root/demo.git
cd demo
echo "Hello World" > index.html
git add index.html
git commit -m "add index.html"
git push
打开 Jenkins 项目进行构建
查看 Web 服务器文件
HTTP 422 请求格式正确,但是由于含有语义错误,无法响应
解决方法:检查WebHooks地址是否正确
请求页面没用找到
解决方法:前往gitlab配置勾选 Enable authentication for '/project' end-point
关闭跨站请求伪造保护,高版本jenkins取消了这个机制的关闭,这里直接对配置文件进行修改
解决方法:
vim /etc/sysconfig/jenkins
47行 修改为
JENKINS_JAVA_OPTIONS="-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dhudson.security.csrf.G lobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
systemctl restart jenkins
缺少软件包Git
解决方法:需要安装Git,并进行初始化,步骤参考章节2.5