持续集成与持续交付(git工具+gitlab私有仓库+jenkins持续集成)+配置企业级镜像仓库harbor
1.git工具使用
实验环境:
server1:172.25.0.1(4G内存)
1.1 git介绍
Git特点:
• 速度
• 简单的设计
• 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
• 完全分布式
• 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
• 自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的 目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。
• Git必看秘籍:https://git-scm.com/book/zh/v2
Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
• 已修改表示修改了文件,但还没保存到数据库中。
• 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
• 已提交表示数据已经安全地保存在本地数据库中。
• 这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。

1.2 git版本控制系统介绍



1.3 git安装
安装git:yum install -y git
初始化版本库:
mkdir demo
git init
ls .git/ .git目录是git跟踪管理版本库的


获取Git 仓库通常有两种方式:
• 将尚未进行版本控制的本地目录转换为 Git 仓库。
• 从其它服务器克隆 一个已存在的 Git 仓库。比如:git clone
1.4 gif的使用命令
用户信息
git config --global user.name "red"
git config --global user.email root@red.org
检查当前文件状态
git status
git status -s //简化输出
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。
跟踪新文件
git add README
忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。
cat .gitignore
.* ##忽略所有隐藏文件
/test ##只忽略当前目录下的test文件
build/ ##忽略任何目录下名为 build 的文件夹
文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符
查看已暂存和未暂存的修改
git diff
提交更新
git commit
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。也就是修改之后还没有暂存起来的变化内容。
跳过使用暂存区域
git commit -a -m 'added new benchmarks'
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
git rm PROJECTS.md
git rm --cached README
重命名文件
git mv README.md README其实,运行 git mv 就相当于运行了下面三条命令:
mv README.md README
git rm README.md
git add README
查看提交历史
git log
git log -p -2
git log --stat
git log --pretty=oneline
git reflog
取消暂存的文件
git reset HEAD README.md
撤消对文件的修改
git checkout -- README.md
版本回退
git reflog
git reset --hard efa267a












1.5 远程仓库的使用
远程仓库:注册github帐号,并新建一个仓库:


使用https方式推送每次需要输入用户名和密码,如果不想麻烦的话采用ssh方式:
ssh-keygen -t rsa -b 4096 -C "server1@red.org生成本地密钥,并上传公钥到github:



推送本地仓库内容到github:
cd demo需要进入工作目录
git remote add origin https://github.com/aimee-red/demo.git
关联远程仓库
git push -u origin master //第一次推送需要加 -u参数




**
2.gitlab代码仓库
2.1 GitLab的安装
官网:https://about.gitlab.com/install
软件下载(官方下载慢,推荐使用国内镜像站点) :https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
软件安装: (官方推荐至少4G内存)
yum install -y curl policycoreutils-python openssh-server 解决依赖性
yum install -y gitlab-ce-12.8.5-ce.0.el7.x86_64.rpm 安装gitlab
vim /etc/gitlab/gitlab.rb
external_url 'http://172.25.0.1' //访问gitlab的地址
gitlab-ctl reconfigure 重载服务
登录gitlab: http://172.25.0.1 注意:用户:root 第一次登录需要强制修改密码




2. gitlab常用命令:
gitlab-ctl start # 启动所有gitlab 组件
gitlab-ctl stop # 停止所有 gitlab 组件
gitlab-ctl restart # 重启所有 gitlab 组件
gitlab-ctl status # 查看服务状态
gitlab-ctl reconfigure重载服务
gitlab-ctl tail # 查看日志
2.3 GitLab的使用





上传文件到私有仓库:
rm -fr demo删除原有文件
git clone git@172.25.0.1:root/demo.git远程登录私有仓库
cd demo/
git remote -v查看远程登录仓库信息
vim index.html
git add index.html
git commit -m "add index.html"
git push -u origin master上传



3.jenkins持续集成
实验环境:
server2:172.25.0.2(2G内存)
3.1 Jenkins的介绍
1.Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、 自动化, 满足任何项目的需要。
2.Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
3.CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后, 立刻进行构建、(单元)测试。

4.CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部 署到更贴近真实运行环境(类生产环境)中。

3.2 Jenkins的安装
软件下载:https://jenkins.io/zh/download
国内镜像站:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat
安装jenkins:
rpm -ivh jdk-8u171-linux-x64.rpm
rpm -ivh jenkins-2.225-1.1.noarch.rpm
systemctl start jenkins


访问: http://172.25.0.12:8080
使用初始密码登录:cat /var/lib/jenkins/secrets/initialAdminPassword安装默认插件即可,使用admin用户,登录后修改密码。


更新插件源:
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
cd /var/lib/jenkins/update
sed -i.bak 's/http:\/\/updates.jenkinsci.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
systemctl restart jenkins重启后下载才会变快


3.3 Jenkins的使用





添加访问git仓库的私钥 



定义轮询间隔,有更新时触发jinkens构建



Git提交代码到gitlab,jinkens轮询检测到代码仓库的变更,触发构建。

3.4 Jenkins自动构建docker镜像
在Jenkins主机中安装docker
yum install -y containerd.io-1.2.5-3.1.el7.x86_64.rpm docker-ce-18.09.6-3.el7.x86_64.rpm container-selinux-2.21-1.el7.noarch.rpm docker-ce-cli-18.09.6-3.el7.x86_64.rpm
vim /etc/sysctl.d/bridge.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
sysctl --system
systemctl start docker
docker load -i nginx.tar




修改docker.sock权限,不然jenkins无法直接执行docker命令
在gitlab主机编写dockerfile
cd demo/
vim Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
git add Dockerfile
git commit -m "add Dockerfile"
git push -u origin master




在Jenkins中设置
删除之前的构建

























代码提交,镜像构建等一系列动作都自动完成
3.5 gitlab自动触发jenkins(添加gitlab插件)






手动触发




配置实时触发














3.6 Jenkins使用tls方式连接docker构建主机
使用环境:
增加主机server3:172.25.0.3
server3安装docker,作为docker主机被远程构建






Jenkins使用tls方式连接docker构建主机
1.生成key和ca证书
cd /etc/docker
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem



2.生成server-key和csr文件(server3为dcker主机名)
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=server3" -sha256 -new -key server-key.pem -out server.csr

3.可以使用ip地址方式进行tls连接
echo subjectAltName = DNS:server3,IP:172.25.0.13,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf


4.安装docker证书:
cp /usr/lib/systemd/system/docker.service /etc/systemd/system/docker.service
vim /etc/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// -containerd=/run/containerd/containerd.sock --tlsverify
--tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2375
systemctl daemon-reload
systemctl restart docker
netstat -antlp |grep :2375


5.生成客户端key和证书
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf





测试






6.添加ssh插件,配置server4使工作交付到server4















完整测试





git—>gitLab(server1)—>jenkins(server2)—>build host(server3)—>harbor—>deliver(server4)
3.7 Jenkins+ansible
实验环境:
server4作为ansible交付
server5:172.25.0.5作为

添加ansible交付任务:
• Jenkins服务器提前部署好到目标主机的ssh免密,并安装ansible软件包。
• 由于是以jenkins用户调用ansible命令,所以需要设置jenkins用户到目标主机的免密。
• 新建playbook代码仓库













vim playbook/ansible.cfg
[defaults]
command_warnings = False
remote_user = ansible
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

mkdir inventory
cd inventory/
vim test
[test]
172.25.0.4
vim proc
[proc]
172.25.0.5

vim playbook.yml
---
- hosts: all
tasks:
- name: install apache
yum:
name: httpd
state: present
- name: start apache
service:
name: httpd
state: started














4.配置企业级镜像仓库harbor
实验环境:
harbor:172.25.0.10
官方下载:https://github.com/goharbor/harbor/releases
4.1 安装配置harbor
安装docker
·yum install -y containerd.io-1.2.5-3.1.el7.x86_64.rpm container-selinux-2.21-1.el7.noarch.rpm docker-ce-18.09.6-3.el7.x86_64.rpm docker-ce-cli-18.09.6-3.el7.x86_64.rpm安装docker
vim /etc/sysctl.d/bridge.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
systemctl enable docker --now启动docker



安装harbor
cp docker-compose-Linux-x86_64-1.24.1 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
mkdir -p /data/certs
cd /data/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout red.org.key -x509 -days 365 -out red.org.crt Generating a 4096 bit RSA private key生成https加密证书
..++
..................................................++
writing new private key to 'red.org.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:red
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:reg.red.org
Email Address []:root@red.com
tar zxf harbor-offline-installer-v1.10.1.tgz解压包
cd harbor/
vim harbor.yml配置harbor
hostname: reg.red.org
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/certs/red.org.crt ##设置证书位置
private_key: /data/certs/red.org.key
harbor_admin_password: redhat ##设置密码
vim /etc/hosts做地址解析
172.25.0.10 localhost reg.red.com
./install.sh安装harbor











4.2 配置本地上传文件
mkdir -p /etc/docker/certs.d/reg.red.org
cp /data/certs/red.org.crt /etc/docker/certs.d/reg.red.org/ca.crt拷贝证书到docker主机
docker load -i nginx.tar
docker tag nginx:latest reg.red.org/library/nginx:latest
docker login localhost
docker push reg.red.org/library/nginx


4.3 配置远程上传文件



也可以设置私有仓库
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.red.org"]
}
systemctl restart docker
docker rmi reg.red.org/library/nginx:latest删除之前的镜像
docker pull nginx直接从私有仓库下载

4.4 设置harbor私有仓库




开发人员具备上传文件的权利
docker tag busybox:latest reg.red.org/private/busybox:latest
docker login reg.red.org
docker push reg.red.org/private/busybox





私有仓库公开以后可以匿名下载
4.5 增加harbor仓库镜像扫描、签名功能
参考官网:https://goharbor.io/docs/1.10/working-with-projects/working-with-images/pulling-pushing-images/
cd harbor/
docker-compose stop
./prepare


镜像检测





镜像信任
参考官方文档:https://docs.docker.com/engine/security/trust/content_trust/


1.部署根证书: (使docker引擎和操作系统都可以识别到证书)
/etc/docker/certs.d/reg.westos.org/ca.crt 给docker引擎使用
~/.docker/tls/reg.westos.org:4443/ca.crt 给操作系统使用
mkdir -p .docker/tls/reg.red.org:4443
cp /etc/docker/certs.d/reg.red.org/ca.crt .docker/tls/reg.red.org:4443

2.启用docker内容信任:
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://reg.red.org:4443


3.上传镜像:
docker tag game2048:latest reg.red.org/private/game2048:latest
docker push reg.red.org/private/game2048上传没有打标签的镜像
docker tag game2048:latest reg.red.org/private/game2048:v1
docker push reg.red.org/private/game2048:v1上传没有打标签的镜像,这里签名和标签是绑定的
docker tag game2048:latest reg.red.org/private/game2048:v2
docker push reg.red.org/private/game2048:v2




4.删除签名:
docker trust revoke reg.westos.org/library/nginx:latest回收签名



更多推荐
所有评论(0)