ssgo/deploy是一套简单易用的构建部署工具。
首先宿主机上要安装docker。
然后运行:
docker run -d --restart=always --network=host --name deploy -v /opt/deploy:/opt/deploy -v /var/run/docker.sock:/var/run/docker.sock {deploy-image}
容器运行起来后,就可以使用deploy了,直接使用宿主机的docker资源。
docker run使用 -e 'deploy_manageToken=xxxx' 可以给deploy提供登录密码,如果没有设置默认密码为91deploy。
deploy的启动也可以在ssgo/hub中配置开启。
hub访问通过:http://xx.xx.xx.xx:7777/
默认使用 8888 端口,可以使用 -p xxxx:7777 来改变端口。
或者启动容器指定 service_listen=":xxxx" 来改变端口。
容器启动需要使用主机网络模式,使用宿主机网络和端口,通讯效率高。
数据会存储在 /opt/data 下,可以使用 -v /opt/hub:/opt/data 来挂载外部磁盘。
/var/run/docker.sock代表容器内部使用宿主机的docker。
镜像也可以自己根据ssgo/deploy的代码进行构建。
编译deploy:
mkdir -p dist
sed -i 's/__TAG__/$TAG/g' www/index.html www/views/Deploy.html
go mod tidy
go build -ldflags -w -o dist/server *.go
cp *.yml dist/
cp -ra www dist/
Dockerfile:
FROM alpine
ADD zoneinfo/PRC /etc/localtime
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories \
&& apk add tzdata git openssh-client docker \
&& rm -f /var/cache/apk/* /usr/bin/dockerd /usr/bin/containerd* \
&& rm -f /usr/bin/ctr /usr/bin/runc /usr/bin/docker-proxy \
&& echo -e "Host *\n StrictHostKeyChecking no\n UserKnownHostsFile=/dev/null" >> /etc/ssh/ssh_config
ADD dist/ /opt/
ENTRYPOINT /opt/server
HEALTHCHECK --interval=10s --timeout=3s CMD /opt/server check
构建镜像:
docker build . -t $REGISTRY$CONTEXT/$PROJECT:$TAG
//docker login $REGISTRY
docker push $REGISTRY$CONTEXT/$PROJECT:$TAG
//……
可在项目根目录放置一个 deploy.json:
{
"dataPath": "",
"manageToken": "91deploy"
}
dataPath 代表hub的配置持久化存储的路径,不填写默认为/opt/deploy。
manageToken 代表hub的登录密码,以读写方式查看节点和应用的运行状态,不填写默认为91deploy。
可以使用 -e 'deploy_xxxxxx=xxxx' 进行配置。
启动容器:
使用 -e hub_managerToken=91hub 配置查看和管理口令进行登录授权。
使用 -e service_xxxx 来配置 http 相关参数,例如可以配置为基于 https 访问,具体配置请参考 https://github.com/ssgo/s。
全局变量,可以全局所有项目使用。
deploy过程中被配置成为运行范围内有效的环境变量,对每一个项目都起效果。
构建缓存,尤其是依赖包,下次构建无更新可以不用在线拉取。
可以在这里配置token,提供api,相应主机调用这个api以后,可以同步sskey的指定key到目标节点。
复制以下command到sskey服务器执行:
sskey sync keyName url/${token}
即可将key以加密形式同步到当前机器
sskey sync的使用具体可以参考:sskey详细使用手册。
deploy的公钥,添加公钥到目标服务器中,放入~/.ssh/authorized_keys中。
可以用作远程部署。
也可以添加到私有代码仓库的SSH Keys,才能用SSH的方式无密拉取代码。
将Repository、build、deploy归类管理。
可以在这里设定项目名称、仓库地址(Repository),Deploy Token,备注,build and deploy脚本(script),按照标签deploy,查看build历史记录。
镜像仓库地址是私有仓库的时候,请使用ssh方式,将公钥加入gitlab的用户setting中,直接clone代码,具体类似:
ssh://[email protected]:port/group/xxx.git
Deploy Token 是给deploy开放api使用的。外部使用api使用token后,可以直接调用来完成deploy,一个项目一个Deploy Token。
Script包含build和deploy两大部分,用于项目的build与deploy。
build与deploy脚本可以使用变量,变量就在Vars设定,仅仅在当前context下有效。
deploy过程中被配置成为运行范围内有效的环境变量,对整个context中每一个项目都起效果。
当前context的管理token,使用这个token可以调用api设定当前context的项目仓库和deploy脚本,实际build与deploy。
也可以直接登录到deploy平台管理context与project。
当前context的备注。
自定义项目的build和deploy脚本,如下:
cachetag: $CONTEXT
cache: abc cache node_modules
build:
- from: local
script:
- mkdir -p dist
- mkdir -p cache
- cp abc.txt dist/
- sskey-go:aaa echo 'go build'
- echo -n "$globalTitle" >> cache/stars
- echo $(cat cache/stars) = $check1
- test "$(cat cache/stars)" = $check1
- cp cache/stars dist/stars
- from: local # [email protected]
script:
- echo -n "$flag" >> cache/stars
- test "$(cat cache/stars)" = $check2
- cp cache/stars dist/stars
deploy:
from: local
dockerfile:
- FROM alpine:latest
- ADD dist/ /opt/
- ENTRYPOINT /opt/server
- RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories
&& apk add openssh-client
&& rm -f /var/cache/apk/*
- HEALTHCHECK --interval=10s --timeout=3s CMD /opt/server check
script:
- docker build . -t $REGISTRY$CONTEXT/$PROJECT:$TAG
- docker push $REGISTRY$CONTEXT/$PROJECT:$TAG
build缓存,主要存放依赖包,每更改一次cacheTag重新拉取一次依赖包。
如果没有填写,默认为:
contextName + "-" + projectName
依赖包的实际存放目录:/${DataPath}/_cache/${cacheTag}/${cache}
例如:
/opt/deploy/_caches/ssgo-gateway-1.1/go
cache名字建议不要更改,自定义的cache名字很有可能不可被缓存。
以下是各个技术栈默认的cache名:
技术栈 | 依赖管理软件 | cache名字 | 备注 |
---|---|---|---|
java | maven | .m2 | 其他依赖管理软件下载的依赖包 示具体情况而定 |
php | compose | vendor | |
javascript | npm | node_modules | |
go | go mod | go | 有些依赖管理软件使用vendor |
当前project编译打包build的过程。
编译打包,提供项目部署文件、文件夹、压缩包、打包文件等。
from:local 代表本地构建。
from:[email protected] ssh无密登录到指定机器进行构建。
from:ssgo/hub 开启容器构建:
docker run -rm -v cachePath:cachePath -v buildPath:/root 指定参数 sh /root/buildFile
其中指定参数的第一个参数是镜像地址
运行容器,把后续命令放入构建文件中,执行。
执行的linux脚本。
ssgo/deploy的构建支持:
sskey-go:aaa echo 'go build'
代表根据aaa密钥提供go语言版本sskey aes加密密钥生成文件,将生成文件放在项目根目录进行构建。
go语言的文件名是:UniqueId.go
,文件名是随机的。
对于php和java来说sskey生成文件分别为sskeyStarter.php与SSKeyStarter.java。
构建后执行 echo 'go build'
也可以自己提供生成文件名。
sskey-go:aaa:ghjasd.go echo 'go build'
代表指定密钥生成文件为ghjasd.go。
使用后这个文件会被系统删除,php是直接在项目中使用,不用删除。
注意:
sskey-go 后半部分定义的shell不可以使用cp||scp||mv命令。
deploy结合SSkey使用流程:
sskey管理员定制编译deploy:
mkdir -p dist
sed -i 's/__TAG__/$TAG/g' www/index.html www/views/Deploy.html
sskey -go sync > _.go
export GOPROXY=https://goproxy.io
export CGO_ENABLED=0
go mod tidy
go build -ldflags -w -o dist/server
rm -f _.go
cp *.yml dist/
cp -ra www dist/
将编译文件写入镜像,服务运行时,管理员在sskey的机器上运行sskey -sync指定秘钥传递给deploy服务,保障sskey秘钥的安全。
经过deploy操作提供成品的过程,产品为镜像或压缩包等。
指定本地或远程服务器执行deploy操作。
与docker的Dockerfile编写语法一致。
注意:换行的时候不一致,这里不要使用反斜线换行,换行后多一个制表符。
执行的linux脚本,制造镜像或其他成品。
到这里完成deploy的工作。
注意:
deploy是生产成品的过程,实际部署可以借助其他工具。
如果部署使用的是docker容器,推荐使用ssgo/hub来做轻量级的容器编排,具体可以查看ssgo/hub。
deploy的开放api可以参考:api文档。
其中字段的具体含义:
- Type有Web,WebSocket,Action,Proxy,Rewrite
- Path是url路径
- AuthLevel是授权等级(authLevel=0表示不需要授权)
- Method就是restful api中的method方法
- In代表入参
- Out代表出参
login api可以直接调用。
其他api需要使用鉴权。使用相关权限的token才可以正常调用api。
token在api请求的header头Access-Token中设置具体值。