一、编译环境:
1.安装go语言
2.优化测试
二、部署环境:
1.部署
第一步:编译环境(Jenkins)
1.安装golang语言
1.下载golang
[root@jenkins opt]# wget https://golang.google.cn/dl/go1.16.6.linux-amd64.tar.gz
[root@jenkins opt]# ll
总用量 689328
-rw-r--r-- 1 root root 129049323 7月 13 06:21 go1.16.6.linux-amd64.tar.gz
2.解压
[root@jenkins opt]# tar xf go1.16.6.linux-amd64.tar.gz -C /usr/local/
3.修改环境变量
[root@jenkins opt]# vim /etc/profile
export GO_HOME=/usr/local/go
export GO_ROOT=/usr/local/go
export GO_PATH=/opt/go
export GOPROXY=https://mirrors.aliyun.com/goproxy/
PATH=$PATH:$GO_HOME:$GO_ROOT:$GO_PATH:$GO_HOME/bin
export PATH
[root@jenkins opt]# source /etc/profile
[root@jenkins opt]# printenv |grep GO
GO_PATH=/opt/go
GOPROXY=https://mirrors.aliyun.com/goproxy/
GO_HOME=/usr/local/go
GO_ROOT=/usr/local/go
[root@jenkins opt]#
2.测试
0.准备目录
[root@jenkins opt]# mkdir /opt/go
[root@jenkins opt]# cd !$
cd /opt/go
1. 创建一个go.mod文 件
[root@jenkins go]# go mod init jenkins-go
go: creating new go.mod: module jenkins-go
[root@jenkins go]# ll
总用量 4
-rw-r--r-- 1 root root 27 4月 16 22:33 go.mod
2.下载go的框架
[root@jenkins go]# go get -u github.com/gin-gonic/gin
3.修改main.go文件 ===生产中这个东西在代码里
[root@jenkins go]# vim main.go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run("0.0.0.0:8888") // listen and serve on 0.0.0.0:8080 #因8080端口被占用,修改默认访问端口8080,改为8888
}
4.运行go
[root@jenkins go]# go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8888
[GIN] 2021/07/30 - 05:58:26 | 404 | 5.682µs | 10.0.0.1 | GET "/"
[GIN] 2021/07/30 - 05:58:26 | 404 | 889ns | 10.0.0.1 | GET "/favicon.ico"
[GIN] 2021/07/30 - 06:00:47 | 404 | 709ns | 10.0.0.1 | GET "/"
[GIN] 2021/07/30 - 06:00:48 | 404 | 745ns | 10.0.0.1 | GET "/"
5.编译一下
[root@jenkins go]# go build main go
会生成一个二进制main二进制文件
[root@jenkins go]# ll
总用量 9452
-rw-r--r-- 1 root root 320 7月 30 05:56 go.mod
-rw-r--r-- 1 root root 6295 7月 30 05:56 go.sum
-rwxr-xr-x 1 root root 9660854 7月 30 07:51 main
-rw-r--r-- 1 root root 303 7月 30 05:57 main.go
root@jenkins go]# mkdir target
[[root@jenkins go]# ll
总用量 9452
-rw-r--r-- 1 root root 320 7月 30 05:56 go.mod
-rw-r--r-- 1 root root 6295 7月 30 05:56 go.sum
-rwxr-xr-x 1 root root 9660854 7月 30 07:51 main
-rw-r--r-- 1 root root 303 7月 30 05:57 main.go
drwxr-xr-x 2 root root 6 7月 30 07:51 target
[root@jenkins go]# rm -rf main
[root@jenkins go]# cd target/
[root@jenkins target]# go build ../main.go
[root@jenkins target]# ll
总用量 9436
-rwxr-xr-x 1 root root 9660854 7月 30 08:05 main
测试访问一下:
二、部署环境:
只需运行构建的二进制文件
1.准备源代码到远程仓库
1.将源代码文件传到远程仓库
1.下载自己的远程仓库到本地[root@web ~]# git@10.0.0.60:technology-department/jenkins-golang.git
正克隆到 'jenkins-golang'...
Username for 'http://192.168.12.40': root
Password for 'http://root@192.168.12.40':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
2.由于我没有go语言的gin框架,所以去gitee随便找的
[root@web ~]# git clone https://gitee.com/lyric/gin-admin.git
正克隆到 'gin-admin'...
remote: Enumerating objects: 12202, done.
remote: Counting objects: 100% (12202/12202), done.
remote: Compressing objects: 100% (6700/6700), done.
remote: Total 12202 (delta 6620), reused 9935 (delta 4587), pack-reused 0
接收对象中: 100% (12202/12202), 20.97 MiB | 3.80 MiB/s, done.
处理 delta 中: 100% (6620/6620), done.
[root@web ~]# ll
drwxr-xr-x 9 root root 209 7月 30 09:00 gin-admin
drwxr-xr-x 3 root root 35 7月 30 06:11 jenkins-golang
[root@web ~]# mv gin-admin/ gin
[root@web ~]# ll
drwxr-xr-x 9 root root 209 7月 30 09:00 gin
drwxr-xr-x 3 root root 35 7月 30 06:11 jenkins-golang
3.将源代码移动到本地仓库
[root@web ~]# mv gin /root/jenkins-golang/
[root@web ~]# cd /root/jenkins-golang/
[root@web jenkins-golang]# ll
总用量 4
drwxr-xr-x 3 root root 70 4月 19 04:18 gin
-rw-r--r-- 1 root root 23 4月 19 04:13 README.md
[root@web jenkins-golang]# git add gin/
4.提交源代码到远程仓库
[root@web jenkins-golang]# git add gin/
[root@web jenkins-golang]# git commit -m 'init' .
[root@web jenkins-golang]# git push -u origin master
Username for 'http://10.0.0.60': root
Password for 'http://root@10.0.0.60':
Counting objects: 159, done.
Compressing objects: 100% (141/141), done.
Writing objects: 100% (158/158), 103.90 KiB | 0 bytes/s, done.
Total 158 (delta 24), reused 0 (delta 0)
remote: Resolving deltas: 100% (24/24), done.
To http://10.0.0.60/technology-department/jenkins-golang.git
fafa706..00efd28 master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
2.Jenkins部署
构建脚本
#!/bin/bash
git checkout $GIT_TAG
export GOPROXY=https://mirrors.aliyun.com/goproxy/
/usr/local/go/bin/go mod init jenkins-go
/usr/local/go/bin/go get -u github.com/gin-gonic/gin
rm -rf target && mkdir target
cd target
/usr/local/go/bin/go build ../main.go
选择标签进行构建
在Jenkins服务器上测试构建
构建后脚本
#!/bin/bash
chmod +x /nfs/v9/target/main
kubectl get pods -n golang | awk '{print $1}' | grep -v "NAME" | xargs -I {} kubectl delete pod -n golang {}
/nfs/v9/target/main &>/dev/null &
构建后部署
#1.编写配置清单上传远程仓库
# 用一个容器将 main 启动起来就行了
kind: Namespace
apiVersion: v1
metadata:
name: golang
---
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: golang
name: golang-deployment
spec:
selector:
matchLabels:
app: golang
deploy: main
template:
metadata:
labels:
app: golang
deploy: main
spec:
nodeName: gdx1
containers:
- name: golang
image: centos:7
command:
- "/bin/bash"
- "-c"
- "/opt/target/main"
command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
livenessProbe:
exec:
command:
- "/bin/bash"
- "-c"
- "cat /opt/target/main"
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 38080
initialDelaySeconds: 30
periodSeconds: 2
volumeMounts:
- mountPath: /opt
name: golang-data
volumes:
- name: golang-data
nfs:
path: /nfs/v9
server: 172.16.1.11
---
kind: Service
apiVersion: v1
metadata:
name: golang-deployment-svc
namespace: golang
spec:
ports:
- port: 38080
targetPort: 38080
selector:
app: golang
deploy: main
clusterIP: None
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
namespace: golang
name: golang-ingress
spec:
rules:
- host: www.golang.cluster.local.com
http:
paths:
- backend:
serviceName: golang-deployment-svc
servicePort: 38080
path: /
3.测试访问