👻
GithubActionsからArgoCDの同期をPush型で実行するサンプル
構成
- AWSEKS
- プライベートサブネットに配置
- ArgoCDのエンドポイントは外部公開されておらず、PortFowardingで接続する必要がある
やりたいこと
- 特定のディレクトリのマニフェストファイルが変更されたら、手動で同期をかけたい
- 通常、ArgoCDはいわゆるPull型でGithubリポジトリをチェックする動作をするため、タイムラグが発生する
- たしかデフォルト3分のはずなのでそこまで待たないはずなのだけど、どうも自動的に同期されないタイミングがちょこちょこある
- この同期タイミングを待たずして、即座に同期させたい
- メインとなるアクションはcompositeで共通化する
サンプル
compositeのActionを呼び出す側のWorkflow
name: sync-argocd-prd
on:
push:
branches: [ master ]
paths:
- "kubernetes/chart/manifests"
workflow_dispatch:
jobs:
sync-argocd-prd:
runs-on: ubuntu-latest
env:
ENV: prd
steps:
- uses: actions/checkout@v2
- name: sync argocd
uses: ./.github/actions/sync_argocd
with:
AWS_ENVIRONMENT: ${{ env.ENV }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PRD_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PRD_SECRET }}
呼び出される側のWorkflow
- AWSCLIを実行したいときのサンプルでよく見かける
aws-actions/configure-aws-credentials@v2
を利用する場合、タイミングにより若干実行バイナリのバージョンが古いことがある模様- なので、直接CLIをインストールしている(正解はわからない)
-
kubectl port-forward
時に注意が必要- アンパサンドをつけてバックグラウンド実行させる
- この場合の、エンドポイントは、
localhost:8080
となる-
127.0.0.1:8080
だと繋がりません
-
name: "argocd sync"
description: "argocd sync"
inputs:
AWS_ENVIRONMENT:
description: "AWS_ENVIRONMENT"
required: true
AWS_ACCESS_KEY_ID:
description: "AWS_ACCESS_KEY_ID"
required: true
AWS_SECRET_ACCESS_KEY:
description: "AWS_SECRET_ACCESS_KEY"
required: true
runs:
using: composite
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install AWS CLI
shell: bash
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
which aws
aws --version
- name: Add aws profile credentials to ~/.aws/credentials
shell: bash
run: |
aws configure set aws_access_key_id ${{ inputs.AWS_ACCESS_KEY_ID }} --profile githubactions --region ap-northeast-1
aws configure set aws_secret_access_key ${{ inputs.AWS_SECRET_ACCESS_KEY }} --profile sample --region ap-northeast-1
- name: Configure EKS
shell: bash
run: |
echo ${{ inputs.AWS_ENVIRONMENT }}
aws eks update-kubeconfig --name ${{ inputs.AWS_ENVIRONMENT }}-eks-cluster --profile sample--region ap-northeast-1
- name: install argocd
shell: bash
run: |
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd
- name: install kubectl
shell: bash
run: |
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version --client
- name: portforwarding argocd service
shell: bash
run: |
nohup kubectl port-forward svc/argocd-server -n argocd 8080:443 &
- name: login argocd
shell: bash
run: |
PASSWORD=$(kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" -n argocd | base64 -d; echo)
argocd login localhost:8080 --username admin --password ${PASSWORD} --insecure
- name: execute sync command
shell: bash
run: |
argocd app sync sampleapp
Discussion