# golang 으로 만들고 docker 환경으로 실행되는 drone ci 를 사용해보자.
# 우선 로컬에서 테스트하기 때문에
# (reverse proxy 로 ngrok 도메인 -> localhost 로 터널링 해주는) ngrok 설치
brew install ngrok
# http://fe9b41d98488.ngrok.io -> http://localhost:80 포워딩을 위해 실행
# 참고 https (tls) 터널링은 유료 버전만 가능하고, 그외 동시접속 제한이 있다.
ngrok http 80
# github oauth 로 drone 앱(서버)를 등록
# github -> settings -> developers -> oauth apps 에서 신규 생성한다.
# homepage url : http://dd441e3e9f16.ngrok.io
# callback url : http://dd441e3e9f16.ngrok.io/login
# oauth app 생성후
# client -> DRONE_GITHUB_CLIENT_ID
# client secret -> DRONE_GITHUB_CLIENT_SECRET 로 사용한다.
# generate a new client secret(생성후 한번 볼 수 있어 복붙해둬야 한다) -> DRONE_GITHUB_CLIENT_SECRET 값으로 사용
# drone <-> runner 간 RPC 통신을 위한 secret 생성 -> DRONE_RPC_SECRET 값으로 사용
openssl rand -hex 16
d087c94b8155367b1982238df930c2f2
# drone 도커 이미지 다운로드
docker pull drone/drone:1
# 실행
# github enterprise 는 깃헙 서버 환경 변수 설정 필요
# --env=DRONE_GITHUB_SERVER=https://github.ysoftman.com \
# 볼륨 연결로 /data/database.sqlite -> 호스트의 /var/lib/drone/database.sqlite 로 저장
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_DATABASE_DRIVER=sqlite3 \
--env=DRONE_DATABASE_DATASOURCE=/data/database.sqlite \
--env=DRONE_GITHUB_CLIENT_ID=깃헙_클라이언트_id \
--env=DRONE_GITHUB_CLIENT_SECRET=깃헙_클라이언트_secret \
--env=DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f2 \
--env=DRONE_SERVER_HOST=127.0.0.1 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_WEBHOOK_ENDPOINT=http://dd441e3e9f16.ngrok.io/hook \
--env=DRONE_WEBHOOK_SECRET=d087c94b8155367b1982238df930c2f2 \
--env=DRONE_REPOSITORY_FILTER=ysoftman,bill \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
# 이제 다음 url 로 github authorize 하면 깃헙으로 로그인상태로 drone ci 를 사용할 수 있다.
http://dd441e3e9f16.ngrok.io
# DRONE_REPOSITORY_FILTER 으로 특정 저장소에만 drone과 연결 할 수 있다.
# 설정 변경 후 사용자별로 로그아웃 후 다시 로그인 해야 반영된다.
#####
# 상황에 맞는 여러 runner(러너)가 있다.
# docker(임시 컨테이너를 생성해 실행할때 사용) 러너 설치
docker pull drone/drone-runner-docker:1
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=dd441e3e9f16.ngrok.io \
-e DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=${HOSTNAME} \
-e DRONE_DEBUG=true \
-e DRONE_TRACE=true \
-p 3000:3000 \
--restart always \
--name runner \
drone/drone-runner-docker:1
# exec(docker 와 같은 고립된 환경이 아닌 drone 서버 장비에서 쉘 환경에서 명령을 실행할 때 사용) 러너를 설치
curl --proxy "필요한 경우 프록시 설정" -L https://github.com/drone-runners/drone-runner-exec/releases/latest/download/drone_runner_exec_linux_amd64.tar.gz | tar zx
sudo install -t /usr/local/bin drone-runner-exec
mkdir -p /home/ysoftman/.drone-runner-exec
touch /home/ysoftman/.drone-runner-exec/config
cat > /etc/drone-runner-exec/config << eof
DRONE_RPC_PROTO=http
DRONE_RPC_HOST=dd441e3e9f16.ngrok.io
DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f
DRONE_LOG_FILE=/home/ysoftman/.drone-runner-exec/log.txt
eof
drone-runner-exec service install
drone-runner-exec service start
# drone-runner-exec 서비스 상태 확인
systemctl status drone-runner-exec.service
# docker 환경 변수 확인
docker inspect -f "{{.Config.Env}}" drone | tr " " "\n"
# ssh(ssh 로 서버에 접속해 명령을 실행하는 용도) 러너 설치
docker pull drone/drone-runner-ssh
docker run -d \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=dd441e3e9f16.ngrok.io \
-e DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f \
-p 3000:3000 \
--restart always \
--name runner \
drone/drone-runner-ssh
# 루트 경로에 .drone.yml 를 작성한다.
# 파일명은 drone ci settings 에서 변경 가능하다.
---
kind: pipeline
type: exec
name: default
platform:
os: linux
arch: amd64
trigger:
event:
- push
steps:
- name: 작업1
commands:
- echo hello world1
- name: 작업2
commands:
- echo hello world2
- name: 슬랙 알림
# environment:
# noti_msg: "Branch: ${DRONE_BRANCH}\nAuthor: ${DRONE_COMMIT_AUTHOR}\nLink: ${DRONE_COMMIT_LINK}"
# build_status: "✅ build ${DRONE_BUILD_NUMBER} succeeded. Good job."
commands:
- echo "파이프 종료"
- export HTTP_PROXY="http://프록시서버"
- export noti_msg="Branch ${DRONE_BRANCH}\nAuthor ${DRONE_COMMIT_AUTHOR}\nLink ${DRONE_COMMIT_LINK}"
- export build_status="✅ build ${DRONE_BUILD_NUMBER} succeeded. Good job."
- echo $DRONE_BUILD_STATUS
- if [[ $DRONE_BUILD_STATUS == "failure" ]]; then build_status="❌ build ${DRONE_BUILD_NUMBER} failed. Fix me please."; fi
- |
curl https://hooks.slack.com/services/..... -d "payload={\"channel\": \"#billtest\", \"text\": \"파이프 라인 시작\n$noti_msg\n$build_status\"}"
# ---
# kind: pipeline
# type: ssh
# name: default
# # 접속할 대상 서버
# server:
# host: ysoftman-server.com
# user: deploy
# password:
# from_secret: password
# steps:
# - name: 작업1
# commands:
# - echo hello world1
# - name: 작업2
# commands:
# - echo hello world2
# ---
# kind: pipeline
# type: docker
# name: slack notification
# # 사내환경등에서 외부 접속이 안되는 경우 프록시 환경 변수 설정
# environment:
# HTTP_PROXY: "http://프록시주소"
# HTTPS_PROXY: "http://프록시주소"
# steps:
# - name: 슬랙 알림
# # 사내환경등에서 외부 이미지 다운로드가 안되는 경우 알맞게 변경
# image: plugins/slack
# settings:
# # https://my.slack.com/services/new/incoming-webhook 참고
# webhook: https://hooks.slack.com/services/.....
# channel: ysoftman-test
# template: >
# {{#success build.status}}
# build {{build.number}} succeeded. Good job.
# {{else}}
# build {{build.number}} failed. Fix me please.
# {{/success}}
# Branch: {{ build.branch }}
# Author: {{ build.author }}
# Link: {{ build.link }}
# 이제 drone DRONE_WEBHOOK_ENDPOINT 변수로 설정된 url 을
# github 저장소 webhook url 을 추가해 push 되면 drone 에 알리도록 한다.
http://dd441e3e9f16.ngrok.io/hook
# 참고로 위의 HTTP_PROXY 와 같은 환경변수를 사용할때
# ${HTTP_PROXY} 는 안되고 {} 를 제거한 $HTTP_PROXY 로 사용해야 한다.
#####
# drone cli 툴 사용 https://docs.drone.io/cli/install/
# 설치
brew install drone-cli
# aaaaabbbbb11111 는 drone > User Settings > token 로 확인
# 접속할 drone 서버 환경 변수 설정
export DRONE_SERVER=http://dd441e3e9f16.ngrok.io
export DRONE_TOKEN=aaaaabbbbb11111
# 접속 여부 확인
drone info
# .drone.yml 작업 수행(커밋 전에 미리 로컬에서 테스트할 수 있다.)
# drone exec 현재 type: docker 만 실행된다.
# .drone.yml 을 다음과 같이 만들고
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang:1.13
commands:
- echo "aaa"
# 실행
# .drone.yml syntax 체크등에 활용할 수 있다.
drone exec