Jenkins & Harbor

Harbor 环境搭建

https://github.com/goharbor/harbor/releases/tag/v2.5.6

点击下载地址安装包

安装

解压安装包

[root@localhost ~]# tar -zxvf harbor-offline-installer-v2.5.6.tgz -C /usr/local/

修改harbor.yml配置


image.png
[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml
[root@localhost harbor]# vi harbor.yml
[root@localhost harbor]# ./install.sh 

[Step 0]: checking if docker is installed ...

Note: docker version: 23.0.3

[Step 1]: checking docker-compose is installed ...

Note: Docker Compose version v2.17.2

[Step 2]: loading Harbor images ...

登录

Harbor http://192.168.232.7 admin/Harbor12345

image.png

创建账户

在某些情况下,为了 Harbor仓库的安全性考虑,在流水线任务中直接配置用户的话,后面还要维护其权限,命名项目是公开的了,登录成功在构建步骤中推送时,提示没有权限,直接配置 admin 用户,又不太合适,这时,可以考虑使用 Harbor 自带的 机器人账号。


image.png

docker 添加harbor支持

修改daemon.json,支持Docker仓库,并重启Docker。

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jrabvn1q.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.232.7:80"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

发布镜像到Harbor

登录方式一、直接使用admin账户登录

docker login -u admin -p Harbor12345 http://192.168.232.7:80

登录方式二、机器人账户登录
官方文档 https://goharbor.io/docs/1.10/working-with-projects/project-configuration/create-robot-accounts/

[root@localhost ~]# docker login http://192.168.232.7:80
Username: robot$devops
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

博客文档 https://www.cnblogs.com/phpper/p/12899895.html
创建一个~/password.txt文件,将我们的机器人secret写到文件中,然后执行如下命令

cat ~/password.tx | docker login --username 'robot$devops' --password-stdin http://92.168.232.7:80

用机器人账户登录harbor,登录后会生成一个~/.docker/config.json文件,有了这个文件后,后续就不用再次输入密码了。

登录成功修改镜像名称,然后推送镜像,发布镜像到Harbor名称要求:[harbor地址/项目名/镜像名:版本] (192.168.232.7:80/repository/mytest:v1.0.0)

[root@localhost ~]# docker images
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
192.168.232.7:80/repository/mytest   v1.0.0    66bbba1a6aa6   11 hours ago   832MB
mytest                               v1.0.0    66bbba1a6aa6   11 hours ago   832MB
[root@localhost ~]# docker tag mytest:v1.0.0 192.168.232.7:80/repository/mytest:v1.0.0
[root@localhost ~]# docker push 192.168.232.7:80/repository/mytest:v1.0.0

从Harbor拉取镜像

先配置/etc/docker/daemon.json文件,然后重启docker,最后拉取镜像。

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jrabvn1q.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.232.7:80"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 拉取镜像
[root@localhost ~]# docker pull 192.168.232.7:80/repository/mytest:v1.0.0
v1.0.0: Pulling from repository/mytest

Jenkins打通Harbor

构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部默认是不带docker的,但是我们建议直接使用宿主机带的Docker即可。

设置宿主机docker.sock权限

sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock

查看结果

[root@localhost run]# ll | grep docker
drwx------.  8 root   root    180 4月   8 07:22 docker
-rw-r--r--.  1 root   root      5 4月   8 07:22 docker.pid
srw-rw-rw-.  1 root   root      0 4月   6 16:52 docker.sock
[root@localhost run]# 

添加Jenkins数据卷

修改/usr/local/docker/jenkins/docker-compose.yml文件,

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.346.3-2-lts-jdk11
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      # 将jenkins的工作目录映射到宿主机的data目录
      - ./data/:/var/jenkins_home/
      # 将宿主机的docker映射到jenkins容器
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json

然后重启容器:

cd /usr/local/docker/jenkins
docker-compose down
docker-compose up -d

Jenkins 任务配置

定义参数

image.png
image.png
image.png
image.png

拉取分支代码

image.png
# 配置参数
REMOTE_NAME="origin"    # 远程仓库名
BRANCH_NAME=$branch     # 拉取的分支名

BRANCH_NAME=${BRANCH_NAME#*/}

# 检查输入参数
if [ -z "$BRANCH_NAME" ]; then
  echo "Please provide the branch name as the first argument."
  exit 1
fi

# 判断本地分支是否存在
if git show-ref --verify --quiet "refs/heads/$BRANCH_NAME"; then
  echo "Local branch $BRANCH_NAME exists."
  git checkout $BRANCH_NAME
  git config pull.rebase false
  git pull $REMOTE_NAME $BRANCH_NAME
else
  echo "Local branch $BRANCH_NAME does not exist."
  git fetch $REMOTE_NAME $BRANCH_NAME
  git checkout -b $BRANCH_NAME $REMOTE_NAME/$BRANCH_NAME
fi

# 执行完毕
echo "The latest code has been successfully pulled from the remote branch."
exit 0

maven 打包

image.png

构建docker镜像并上传

image.png
mv **/target/*.jar docker/app.jar
echo "build Image start"
docker build -t $JOB_BASE_NAME:$tag docker/
echo "build Image success"
password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
echo "$password" | docker login $harbor_url --username 'robot$devops' --password-stdin
docker tag $JOB_BASE_NAME:$tag $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
echo "push Image start"
docker push $harbor_url/$harbor_object/$JOB_BASE_NAME:$tag
echo "push Image success"

远程服务器拉取镜像并运行

image.png
harbor_url=$harbor_url
port=$port
tag=$tag
project_name=$JOB_BASE_NAME
imageName=$harbor_url/$harbor_object/$JOB_BASE_NAME:$tag

containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success $containerId"
fi

imageId=`docker images | grep ${project_name} | awk '{print $3}'`

if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success $imageId"
fi

password=ucTv2l1XeBdgO9tkseoyWVLh47sRN9Py
echo "$password" | docker login 192.168.232.7:80 --username 'robot$devops' --password-stdin

docker pull $imageName
docker run -d -p $port --name $project_name $imageName
echo "Start Container Success"
echo $project_name

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容