2022年6月7日星期二

gitlab webhook shell

事前準備

1. webhook docker run.sh 

```
docker run -u root --rm -d -p 9000:9000 \

-v /home/$(whoami)/data/webhook:/etc/webhook \
--name=webhook \
almir/webhook -verbose -hooks=/etc/webhook/hooks.json -hotreload -logfile=/etc/webhook/run.tlog

```

2. hooks.json for gitlab merge request state=merged

#=================

[
  {
    "id": "redeploy",
    "execute-command": "/etc/webhook/redeploy.sh",
    "command-working-directory": "/etc/webhook",
    "response-message": "Executing deploy script...\n",
    "pass-arguments-to-command":
    [
      {
        "source": "payload",
        "name": "project.namespace"
      },
      {
        "source": "payload",
        "name": "project.name"
      },
      {
        "source": "payload",
        "name": "event_type"
      },
      {
        "source": "payload",
        "name": "object_attributes.state"
      },
    ],
    "trigger-rule":
    {
      "and":
      [
      {
      "match":
      {
        "type": "value",
        "value": "{you-webhook-token}",
        "parameter":
        {
          "source": "header",
          "name": "X-Gitlab-Token"
        }
      }   
      },
      {
      "match":
      {
        "type": "regex",
        "regex": "merge_request",
        "parameter":
        {
          "source": "payload",
          "name": "event_type"
        }
      }   
      },
      {
      "match":
      {
        "type": "regex",
        "regex": "merged",
        "parameter":
        {
          "source": "payload",
          "name": "object_attributes.state"
        }
      }
      }
      ]
    }
  }
]

#=================


3. redeploy.sh

#!/bin/sh    #required. format error if no this.
#$1=project.namespace (groupname)
#$2=project.name

echo "$1_$2" > /etc/webhook/$1_$2.log

#l read and write log by anyone 
chmod 666 *.log

4. test webhook 

curl http://localhost:9000/hooks/{id}

6. set webhook url to gitlab 

gitlab/group/project/setting

set webhook url and do test. 

7. cicd.sh

logfile="/etc/webhook/groupname/projectname.log"
#check filetimestamp.
lastModifytime=$(date )


while true
do 

  if [ -e $logfile ]; then
    nowtime=$(stat -c $logfile | grep 'Modify: ' | cut -d' ' -f2,3,4)

    if [ $nowtime -gt $lastModifytime ]; then 

        lastModifytime=$nowtime

        #remove first 
        #rm $logfile
        #do git pull and resync
        cd $git_project_folder  
        git pull 
        resync $from_git_path $to_webserver_path

     fi  
  else

    #sleep 5s
    sleep 5  

  fi   

done 

没有评论: