CI/CD:使用Jenkins(Docker image)自动部署+bitbucket

流程

  1. 开发本机将新的commit push到bitbucket
  2. bitbucket的指定专案变动,透过webhook触发jenkins建置
  3. jenkins根据job的指令(shell script)启动建置作业,包含pull程序码等
  4. 将建置结果透过slack notification通知使用者

在远端主机架设jenkins in docker

作业系统: Ubuntu 16.04.4 LTS

  1. 安装 docker sudo apt install docker.io
  2. 让主机上的docker能不必透过root身份来操作

If you are installing Docker on a Linux-based operating system, ensure you configure Docker so it can be managed as a non-root user

To create the docker group and add your user:

Create the docker group.

 $ sudo groupadd docker
 
Add your user to the docker group.

 $ sudo usermod -aG docker $USER
 
Log out and log back in so that your group membership is re-evaluated.

If testing on a virtual machine, it may be necessary to restart the virtual machine for changes to take effect.

On a desktop Linux environment such as X Windows, log out of your session completely and then log back in.

On Linux, you can also run the following command to activate the changes to groups:

 $ newgrp docker 
  1. 建立一个名为 jenkins 的 bridge network docker network create jenkins
  2. 执行 jenkins-docker
 docker run \
  --name jenkins-docker \
  --rm \
  --detach \
  --privileged \
  --network jenkins \ 
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 \ 
  docker:dind \
  --storage-driver overlay2

注:跑jenkins-docker需要dind这个image,可以事先下载,但如果没下载的话执行完这个指令也会自动帮你装上。
官网有详细解释每行作用:https://www.jenkins.io/doc/book/installing/docker/

  1. 建立一个directory,并在它的目录下新增一个Dockerfile
FROM jenkins/jenkins:2.289.1-lts-jdk11
USER root
RUN apt-get update && apt-get install -y apt-transport-https \
       ca-certificates curl gnupg2 \
       software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.24.6 docker-workflow:1.26"
  1. Build docker image docker build -t myjenkins-blueocean:1.1 .
  2. docker the image (这边为了方便示范,主机开8000 port)
docker run \
  --name jenkins-blueocean \
  --rm \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --publish 8000:8080 \ #将8080 port发布到主机的8000port,让外界可以透过主机上的8000连到container的8080 port
  --publish 50000:50000 \ #这行用在当你的主机上有不只一个jenkins服务在跑
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:1.1 
  1. 开启主机防火墙:8000 port (这边端看你上一步下的docker指令指定了哪个主机上的port)
  2. 浏览器开启http://host:8000即可看到jenkins登入画面docker logs containeriD可以看到secrets,输入这串密码就能进到jenkins dashboard了。

建立Slack app

我们希望无论建置成功与否,在建置完毕後都能被通知。这个部分透过slack notification来达成。

  1. 首先需要一个 Slack App 的 Oauth Token 去做认证
    请到 https://api.slack.com/apps 点选要使用的 Slack App 去取得 Oath Access Token。
  2. 点选右上的Create New App,并点选From sctrach
  3. 点选左边side bar的 OAuth & Permissions。我们需要为这个app产生 Oauth Token。但在这之前必须先连结app到你的workspace。往下滑到Scopes这,我们要选chat:write这个选项

  4. 接着再回到上面,按下 install to workspace,之後就可以产生一组Oauth Token了。等等设定jenkins job时会用到这组token

建立jenkins建置作业

安装plugin

进入Jenkins的管理页面
要完成基本的自动部署,我们需要先安装以下几个plugin:

  1. bitbucket
  2. publish over SSH
  3. slack notification
    可以在[管理 Jenkins] > [管理外挂程序]这边下载,装好之後重启。
    ,新增一个free style作业。

建立free style作业

  1. 新增作业,选free style
  2. 在原始码管理的部分选择git,贴上repo的URL,此时会出现红字错误讯息:

    这是因为我们并没有提供jenkins进入这个repo的权限。在credentials那新增已放到bitbucket repo下的SSH public key(kind选secret text),或bitbucket的帐密(kind选username with password),看你是用https或SSH。

    新增完之後应该要看到错误讯息消失。
  3. 接着在[建置触发程序],勾选[Build when a change is pushed to BitBucket]和[轮询 SCM]

设定bitbucket webhook

先来解释一下webhook的作用。

  • bitbucket的Webhooks:提供在特定事件发生时能让bitbucket向server发出请求的config。webhook作用的三要素包含:resource(git repo),启动webhook的事件和url(事件发生时请求发送的edpoint)。
  1. 设定webhook时要先准备jenkins api token。从 [人员] 那点选我的帐号admin,在设定那边可以看到API Token,点选Add new Token > Generate就可以看到api token了。
  2. 依照以下格式组成你的bitbucket webhook,到bitbucket专案目录下,[Webhooks]那贴上你的webhook URL。
    格式:http://[jenkins 帐号]:[jenkins api token]@[jenkins url]:[jenkins port]/git/notifyCommit?url=[bitbucket branch]
    例如:
    http://admin:[email protected]:8080/git/[email protected]:eunomics/atempo_kid.git
  3. 测试webhook:push看看,在bitbucket [Webhooks] > [刚刚新增的那串webhook] > [View Request]应该可以看到push成功的纪录。

设定slack notification

  1. 再往下看到 [建置後动作] > [ 新增建置後动作 ],点选 [slack notification]
  2. 在[slack notification]的区块,先选取你想要被通知的事件,例如建置成功、建置失败、建置不稳定等...
  3. 接着点选[进阶],填入以下栏位:Workspace, Username(app发送通知时显示的名称), Credential和Channel / member id。其中credentail就是刚刚准备的slack app oauth token,新增一个secret text,将slack app oauth token贴上即可。
  4. 以上设定完後,点选右下角[Test Connection],看能不能收到slack通知。

设定Publish over SSH

  1. 移至[管理Jenkins > 设定系统 > Publish over SSH] 的部份,并如图所示新增 SSH server,然後分别输入 VPS 的:
    • hostname:可下hostname查看
    • username:terminal@前面的部分
    • remote directory:专案路径
  • 点选进阶,勾选 Use password authentication, or use a different key 然後将远端主机的 SSH private key 贴在 Key 上

  • 点选 Test Configuration,然而会出现以下错误

  • 因为在此 jenkins 携带主机的 private key 然後 ssh 进入 VPS 中,因此在主机中,我们必须要为自己的 private key 提供一个 public key 接口。
    将 VPS 的 public key 复制并贴在 authorized_keys 档案里头

    cat ~/.ssh/id_rsa.pub
    sudo vim ~/.ssh/authorized_keys

    再试一次 Test Configuration,应该就会成功了。

这边的行为, Jenkins 会使用 ssh 通道登入远端主机来进行 CD 操作, 而要建立 ssh 连线, 会需要将我们的 public key 给目标主机, 因此目标主机可以使用 Jenkins 主机提供的 public key 来加密资讯
主机加密後传给 Jenkins, Jenkins 再用 private key 来解密, 同理, Jenkins 也会从主机获取主机 public key, blablabla... 所以一台机器上会有自己的 private key 以及目标主机的 public key, 这种行为就是传说中的, 非对称加密

  • 回到刚刚建立的作业,点选组态以便继续编辑

    • 在[建置]中选取 Send files or execute commands over SSH
    • 在 execute commands 中,将必须额外在主机输入的指令放进去

这样应该就完成了,可以去专案主机专案目录底下git log看看是不是有把最新commit拉下来。


<<:  【Android/Kotlin】拍照/相簿照片上传到Server

>>:  CMoney软件工程师战斗营_期末专题制作_Week 16

Android Studio初学笔记-Day23-Banner

Banner 现在因为网路发达加上疫情,网购变得很稀松平常,而在这些购物网站中一定会出现广告的部分,...

D27 - 走!去浏览器学 Drag & Drop 自己组汉堡包

前言 来学拖拉事件自己组汉堡包~~ 实作连结 拖拉事件 drag & drop 拖拉事件 D...

15. Error x Exception x Bug Trackers

初学阶段对错误处理没什麽感觉(尽管几乎所有程序语言书都有这一章节),写的都是不用维护的小专案、没有真...

我该问甚麽篇之找工作小Tips

终於来到最後一天最後一篇啦!!!! 真的好感动QQ 成功完赛了 第三次挑战铁人赛成功~ 每一年都是难...

Day 25 - Permutations

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 46. Permutation...