Go로 슬랙 채널을 열어서 Alfred Workflow를 만들어 봤어요.
이번에 만든 것들에 대한 소개와 공개되기 전에 했던 일들을 정리하고 싶습니다.
이른바 Alfred Workflow
Alfred는 다기능의 빠른 시작 응용 프로그램입니다.
무료 버전에서도 이용할 수 있지만 유료 버전 구매를 통해 워크플로우 기능을 이용할 수 있다.
Workflow 기능은 명령을 입력하여 다양한 작업을 수행하는 기능입니다.워크플로우 기능을 사용할 수 있다면 자체 제작하거나 공개된 워크플로우를 사용해 다양한 조작을 할 수 있다.
자주 사용하는 물건을 총결하였다.
제작된 Alfred Workflow 소개
이번에 제작된 Workflow는 slack의 채널을 지정하고 slack 앱으로 채널을 켜는 간단한 것이다.
기능
채널을 열 때 채널 목록을 가져올 때마다 시간이 걸려서 캐시에 저장됩니다.
Go로 처리 부분 만들기.
다음은 실제 제작된 부분을 소개한다.
먼저 Go로 처리 부분을 구현합니다.
이름이
awgo
인 프로그램 라이브러리를 사용하여 Alfred Workflow를 만들 수 있습니다.Go 설치 섹션은 다음과 같습니다.
slack-go를 사용하여 채널 일람과 팀 ID를 얻어 캐시를 업데이트합니다
awgo에서 열린 채널을 생성하는 항목
실행할 명령 구분
main.go
에서는 채널을 여는 명령과 캐시를 업데이트하는 명령을 명령줄 옵션으로 구분하여 실행할 수 있습니다.main.go
package main
import (
"flag"
aw "github.com/deanishe/awgo"
)
var (
wf *aw.Workflow
cache_dir = "./cache"
cache_file = "cache.json"
)
type Channel struct {
Name string `json:"name"`
ID string `json:"id"`
TeamID string `json:"teamid"`
}
func init() {
wf = aw.New()
}
func run() {
update := flag.Bool("update", false, "Update Channels")
open := flag.Bool("open", false, "Open Channel")
flag.Parse()
if *update {
updateChannels()
return
}
if *open {
openChannel()
return
}
}
func main() {
wf.Run(run)
}
채널 목록 및 팀 ID 가져오기
update.go
에서 slack-go
채널 일람과 팀 ID를 얻었고 awgo
의 캐시 기능으로 저장되어 있습니다.슬랙의 영패는 Alfred에 환경 변수가 있기 때문에 거기에 저장됩니다.
update.go
package main
import (
aw "github.com/deanishe/awgo"
"github.com/slack-go/slack"
)
func updateChannels() {
wf.NewItem("Update Channels").Valid(true)
c := aw.NewCache(cache_dir)
cfg := aw.NewConfig()
token := cfg.Get("SLACK_TOKEN")
api := slack.New(token)
params := slack.GetConversationsParameters{}
channels, _, err_channels := api.GetConversations(¶ms)
team, err_team := api.GetTeamInfo()
if err_channels != nil || err_team != nil {
wf.Warn("Error", "Error occurred in Slack API ")
}
all_channels := make([]Channel, 0)
for _, channel := range channels {
all_channels = append(all_channels, Channel{
Name: channel.Name,
ID: channel.ID,
TeamID: team.ID,
})
}
c.StoreJSON(cache_file, all_channels)
wf.SendFeedback()
}
열려는 채널 항목 생성
캐시 정보에서 열린 채널 항목을 생성합니다.
알프레드 측에서 채널을 열려면 채널 ID와 팀 ID가 필요하기 때문에
Var
방법으로 이들에게 변수로 넘겼다.모든 채널 항목을 생성하면 명령에 지정된 문자열을 사용하여 필터링됩니다.
open.go
package main
import (
aw "github.com/deanishe/awgo"
)
func openChannel() {
c := aw.NewCache(cache_dir)
var c_channels []Channel
if c.Exists(cache_file) {
if err := c.LoadJSON(cache_file, &c_channels); err != nil {
wf.FatalError(err)
}
for _, channel := range c_channels {
wf.NewItem(channel.Name).
Var("teamID", channel.TeamID).
Var("channelID", channel.ID).
Valid(true)
}
}
args := wf.Args()
if len(args) > 1 {
wf.Filter(args[1])
}
wf.SendFeedback()
}
Alfred Workflow 만들기
다음은 Alfred에서 Workflow를 만듭니다.
Workflow의 전체는 다음과 같다.
캐시 업데이트
추가
slack-alfred-workflow
옵션은 Go의 실행 파일-update
을 실행합니다.통로를 열다
-open
추가 옵션 실행{query}
실행할 때 명령을 통해 열린 채널 이름입니다.실제 슬랙 프로그램으로 채널을 엽니다.
open
명령을 사용하면 채널 지정에서 슬랙 프로그램을 열 수 있습니다.Makefile로 구성
생성된 실행 파일과 Alfred Workflow의
info.plist
파일을 zip으로 모아 Workflow 파일을 만듭니다.SHELL := /bin/bash
PLIST=info.plist
ICON=icon.png
EXEC_BIN=slack-alfred-workflow
DIST_FILE=slack.alfredworkflow
GO_SRCS=$(shell find -f . \( -name \*.go \))
all: $(DIST_FILE)
$(EXEC_BIN): $(GO_SRCS)
go build -o $(EXEC_BIN)
$(DIST_FILE): $(EXEC_BIN) $(CREDITS) $(PLIST)
zip -r $(DIST_FILE) $(PLIST) $(ICON) $(EXEC_BIN)
Giithub Action을 사용한 CI/CD
어렵게 구했기 때문에 기릿허브 액션을 사용했습니다.
push는 Workflow 파일을 Giithub의Releases에 업로드합니다.
release.yml
name: Release
on:
push:
tags:
- "v*"
jobs:
release:
runs-on: macos-latest
steps:
- name: Checkout source codes
uses: actions/checkout@v2
- name: Step Go environment
uses: actions/setup-go@v2
with:
go-version: 1.16
- name: Restore cache if available
uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Download modules
if: steps.cache.outputs.cache-hit != 'true'
run: go mod download
- name: Build
run: make
- name: Create new release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: Upload release asset
id: upload_release_asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./slack.alfredworkflow
asset_name: slack.alfredworkflow
asset_content_type: application/zip
참고 자료
Reference
이 문제에 관하여(Go로 슬랙 채널을 열어서 Alfred Workflow를 만들어 봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/monda/articles/slack-alfredworkflow-by-go텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)