jenkins结合gitlab实现自动部署

Posted by Kaka Blog on February 4, 2021

Jenkins和Gitlab均采用Docker方式部署。Gitlab部署见以前的文章。

docker启动Gitlab:

docker run --detach --hostname IP --publish 8320:443 --publish 8321:8321 --publish 8322:22 --name gitlab --restart always --volume /data/dockervol/gitlab/config:/etc/gitlab --volume /data/dockervol/gitlab/logs:/var/log/gitlab --volume /data/dockervol/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

注意:

  • hostname不能加端口
  • --publish 8321:80解决wiki上传不了附件问题:修改/etc/gitlab/gitlab.rb,增加external_url 'http://IP:port',因为设置了扩展url,docker内部不再是80端口,而是port定义的端口,所以外部还是用8321访问内部80会打不开,需要修改docker端口映射为--publish 8321:8321

Gitlab配置SSH Key

ssh-keygen -t rsa -b 4096 -C "admin@example.com"
cat ~/.ssh/id_rsa.pub

复制公钥添加到Gitlab,主要去掉里面的换行符。

测试:c

ssh -vT git@x.x.x.x -p 8322

Jenkins安装

docker run \
  -u root \
  --name jenkins \
  --rm \
  -d \
  -p 49000:8080 \
  -p 50000:50000 \
  -v /data/jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean
# 或
sudo apt-get install openjdk-8-jdk
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

建议直接安装在ubuntu,不然还要通过ssh执行宿主机bash。

编辑/etc/default/jenkins, 修改 ----HTTP_PORT=8080----,如果要修改home目录,请提前修改再开始Jenkins的初始化配置。

Jenkins设置时区和时间:

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

在Jenkins创建任务

首先获取私钥:

cat ~/.ssh/id_rsa

配置git仓库,需要录入上面获取的私钥。

执行Shell,注意在Jenkins上执行npm start是可以执行,但是构建过程一直没结束,会一直阻塞;另外也创建不了会话,例如screen -S api是不起作用的,也不知道是为什么。所以这里用pm2来管理node服务,对于vue项目,最好采用npm build生成静态文件。

配置自动部署

1、Jenkins安装Gitlab插件

2、Jenkins构建触发器选择Build when a change is pushed to GitLab. GitLab webhook URL: XXX,复制URL地址到Gitlab,Allowed branches选择Filter branches by regex,Target Branch Regex可以输入.*master,生成Secret token,复制该值到Gitlab。

3、到Gitlab,找到Setting>Webhooks,输入刚刚的URL和Secret token,不选择Enable SSL verification,点击Add webhook即可,点击Test可以进行测试。