上⼀讲,我介绍了CI和CD的相关概念,并且使⽤Docker+Jenkins+GitLab搭建了我们的CI/CD环境,今天我们就来使⽤已经构建好的环境来实际构建和部署⼀个应⽤。
构建和部署⼀个应⽤的流程可以分为五部分。
1. 我们⾸先需要配置GitLabSSH访问公钥,使得我们可以直接通过SSH拉取或推送代码到GitLab。
2. 接着将代码通过SSH上传到GitLab。
3. 再在Jenkins创建构建任务,使得Jenkins可以成功拉取GitLab的代码并进⾏构建。
4. 然后配置代码变更⾃动构建流程,使得代码变更可以触发⾃动构建Docker镜像。
5. 最后配置⾃动部署流程,镜像构建完成后⾃动将镜像发布到测试或⽣产环境。
接下来我们逐⼀操作。
1.配置GitLabSSH访问公钥
为了能够让Jenkins顺利从GitLab拉取代码,我们需要先⽣成ssh密钥。我们可以使⽤ssh-keygen命令来⽣成2048位的ras密钥。在Linux上执⾏如下命令:
$ ssh-keygen -o -t rsa -b 2048 -C "email@example.com"
# 输⼊上⾯命令后系统会提示我们密钥保存的位置等信息,只需要按回⻋即可。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/centos/.ssh/id_rsa.
Your public key has been saved in /home/centos/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:A+d0NQQrjxV2h+zR3BQIJxT23puXoLi1RiTKJm16+rg email@example.com
The key's randomart image is:
+---[RSA 2048]----+
| =XB=o+o|
| ..=B+o .|
| . + +. o |
| = B .o . |
| o S + o . |
| . * .... . +|
| = ..o +.|
| ... o.. .|
| E=. ... |
+----[SHA256]-----+
执⾏完上述命令后,$HOME/.ssh/⽬录下会⾃动⽣成两个⽂件:id_rsa.pub⽂件为公钥⽂件,id_rsa⽂件为私钥⽂件。我们可以通过cat命令来查看公钥⽂件内容:
$ cat $HOME/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDljSlDNHnUr4ursYISKXK5j2mWTYnt100mvYeJCLpr6tpeSarGyr7FnTc6sLM721plU2xq0bqlFEU5/0SSvFdLTht7bcfm/Hf31EdAuIqZuy/guP06ijpidfX6lVDxLWx/sO3Wbj3t7xgj4sfCFTiv+OOFP0NxKr5wy+emojm6KIaXkhjbPeJDgph5bvluFnKAtesMUkdhceAdN9grE3nkBOnwWw6G4dCtbrKt2o9wSyzgkDwPjj2qjFhcE9571/
然后将公钥⽂件拷贝到GitLab的个⼈设置->SSHKeys中,点击添加按钮,将我们的公钥添加到GitLab中。
2.上传服务代码到GitLab
这⾥,我使⽤Golang编写了⼀个HTTP服务,代码如下:
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {
for name, headers := range req.Header {
for _, h := range headers {
fmt.Fprintf(w, "%v: %v", name, h)
}
}
}
func main() {
http.HandleFunc("/hello", hello)
http.HandleFunc("/headers", headers)