syntax error
go env # 모든 Go 환경 변수 출력
go env GOPATH # 특정 환경 변수 확인
go env GOOS GOARCH # 여러 변수 동시 확인
# 주요 Go 환경 변수들
GOROOT=/usr/local/go # Go 설치 경로
GOPATH=/home/user/go # 워크스페이스 경로
GOOS=linux # 운영체제
GOARCH=amd64 # 아키텍처
아무튼 ..
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
// .env 파일 로드
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
// 환경 변수 읽기
apiKey := os.Getenv("API_KEY")
fmt.Println("API Key:", apiKey)
}
func loadConfig() {
// .env 파일 로드 시도 (실패해도 괜찮음)
if err := godotenv.Load(); err != nil {
log.Println("Note: .env file not found, using system environment variables")
}
}
// 필수 환경 변수 확인
config := &Config{
APIKey: os.Getenv("API_KEY"),
DatabaseURL: os.Getenv("DATABASE_URL"),
Port: getEnvOrDefault("PORT", "8080"),
Environment: env,
}
// 유효성 검사
if config.APIKey == "" {
return nil, log.Fatal("API_KEY environment variable is required")
}
if config.DatabaseURL == "" {
return nil, log.Fatal("DATABASE_URL environment variable is required")
}
return config, nil
}
func getEnvOrDefault(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
// ❌ 잘못된 방법 - os.Getenv는 에러를 반환하지 않음
err := os.Getenv("API_KEY") // 컴파일 에러!
// 아래와 같이 쓴다고함
apiKey := os.Getenv("API_KEY")
if apiKey == "" {
log.Fatal("API_KEY is required") } //종료
확인차 log 메소드를 쓰는데 (stdout+timestamp)가 로그로 나오기에 좀 더 디버깅을 gitlab CI 툴에서 보기 편하다
A[Go 애플리케이션] --> B{출력 방식}
B --> C[fmt.Println]
B --> D[log.Println]
C --> E[stdout만 출력]
D --> F[stdout + 타임스탬프]
E --> G[GitLab CI 로그]
F --> H[GitLab CI 로그<br/>+ 시간 정보]
// log.Printf - 타임스탬프와 함께 출력
if err != nil {
log.Printf("오류 발생: %v", err)
// 프로그램은 계속 실행됨
}
// log.Fatalf - 로그 출력 후 프로그램 종료
if err != nil {
log.Fatalf("치명적 오류: %v", err)
// 프로그램이 즉시 종료됨 (os.Exit(1)과 동일)
}
// 기존 방식
if err != nil {
log.Fatal("환경변수 로드 실패:", err) // 형식이 불일치
}
// 개선된 방식
if err != nil {
log.Fatalf("❌ 환경변수 로드 실패: %v", err) // Printf 형식으로 통일
}
`.gitlab-ci.yml`: (): did not find expected alphabetic or numeric character while scanning an anchor at line 33 column 32`
- [ -z "$NOTION_API_KEY" ] && echo "❌ API KEY 비어 있음" && exit 1
# 올바른 앵커 사용법
default: &default_config
timeout: 30
retries: 3
job1:
<<: *default_config # 앵커 참조
jobs:daily-notion-tasks:script config should be a string or a nested array of strings up to 10 levels deep 뭘까?
//대안 1 따옴표
- '[ -z "$NOTION_API_KEY" ] && echo "❌ API KEY 비어 있음" && exit 1'
// 대안 2 쉘스크립트 치환
- |
if [ -z "$NOTION_API_KEY" ]; then
echo "❌ API KEY 비어 있음"
exit 1
fi
[ -z "$NOTION_API_KEY" ] && … 처럼 대괄호로 시작하면 YAML 은 리스트 리터럴 ([ a, b, c ]) 로 착각해-버립니다.
jobs:daily-notion-tasks:script config should be a string or a nested array of strings …
//틀림
if [-z "$NOTION_API_KEY" ] || [ -z "$NOTION_DATABASE_ID" ]; then
// 맞음
if [ -z "$NOTION_API_KEY"] || [-z "$NOTION_DATABASE_ID"]; then
jobs:daily-notion-tasks:script config should be a string or a nested array of strings…
rules:
- if: '$CI_PIPELINE_SOURCE == "trigger"' # API 트리거
- if: '$CI_PIPELINE_SOURCE == "web"' # 수동 실행
image: golang:1.21
stages:
- build
- deploy
build:
stage: build
script:
- go mod download
- go build -o scheduler main.go
only:
- main
deploy:
stage: deploy
before_script:
- echo "Checking environment variables"
- test -n "$NOTION_API_KEY" || (echo "Missing NOTION_API_KEY" && exit 1)
- test -n "$NOTION_DATABASE_ID" || (echo "Missing NOTION_DATABASE_ID" && exit 1)
script:
- go mod download
- go build -o scheduler main.go
- ./scheduler --now
only:
- triggers
- web
- main
artifacts:
paths:
- scheduler
${변수명:시작위치:길이}
${NOTION_API_KEY:0:10}
# NOTION_API_KEY의 0번째부터 10글자만 출력
# 예: "secret_abc123xyz" → "secret_abc"
# 전체 노출 (위험)
echo "API Key: $NOTION_API_KEY"
# 출력: API Key: secret_abc123xyz789
# 일부만 노출 (안전)
echo "API Key: ${NOTION_API_KEY:0:10}..."
# 출력: API Key: secret_abc...
script:
- echo "test"
- [ -z "$VAR" ] && echo "error" # 문법적으로 유효
[ 로 시작하면 리스트로 해석해서 "배열 안에 배열" 에러
GitLab CI는 순수 YAML보다 엄격함
특수문자([, &, |)는 따옴표로 감싸기
디버깅은 단계별로: CI → 애플리케이션 → API
보안: 민감한 정보는 일부만 로그에 출력